返回在堆上分配的类的实例(C++)[关闭]
Posted
技术标签:
【中文标题】返回在堆上分配的类的实例(C++)[关闭]【英文标题】:Returning an instance of a class allocated on the heap (C++) [closed] 【发布时间】:2015-01-20 03:29:20 【问题描述】:我目前正在编写的程序类似于脚本,但我正在使用(或尝试)将 3 个变量相互关联的 1 个类除外。我有一个名为“SupNetModel”的类,它包含 3 个不同的值,没有类方法。这个类被声明为头文件,因为实际上没有任何方法可以实现它。
#ifndef SUPNETMODEL_H
#define SUPNETMODEL_H
class SupNetModel
public:
//variables
SupNetModel();
;
#endif
我的 main 函数的精简版如下所示:
#include "train.h"
#include "SupNetModel.h"
int main()
//Some stuff
SupNetModel* model = Train(data,labels);
return 1;
Train.cpp 如下所示
#include "train.h"
SupNetModel* Train(arma::mat data, arma::mat labels)
SupNetModel * model = new SupNetModel();
//Do a bunch of stuff
return model;
编辑:Train.h 看起来像:
#ifndef TRAIN_H
#define TRAIN_H
#include <RcppArmadillo.h>
#include "SupNetModel.h"
SupNetModel* Train(arma::mat data, arma::mat labels);
#endif
所以基本上我要做的是在堆上创建我的类的一个实例,然后返回指向该实例的指针,以便我可以在 main 中访问它。但是,目前我收到以下错误“'SupNetModel' 没有命名类型”
如果相关,这是在 R 环境中使用 RCpp 构建的。错误引用的错误行在自动生成的 RcppExports.cpp 中。仔细阅读该文件(其中包含有关类的信息)后,除了 Train 的函数声明行之外,SupNetModel 似乎没有出现在 RcppExports 中。
编辑:这是 RCppExports 文件的相关部分:
// train
SupNetModel* train(arma::mat data, arma::mat labels);
RcppExport SEXP SupervisedNetworks_train(SEXP dataSEXP, SEXP labelsSEXP)
BEGIN_RCPP
SEXP __sexp_result;
Rcpp::RNGScope __rngScope;
Rcpp::traits::input_parameter< arma::mat >::type data(dataSEXP );
Rcpp::traits::input_parameter< arma::mat >::type labels(labelsSEXP );
SupNetModel* __result = trainNetworkOfNetworks(data, labels);
PROTECT(__sexp_result = Rcpp::wrap(__result));
UNPROTECT(1);
return __sexp_result;
END_RCPP
这是我尝试构建项目时出现的最后几行:
g++ -I/usr/share/R/include -DNDEBUG -I"/home/anne/LabWork/qpOASES-3.0.0/include" -std=c++11 -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/home/anne/R/x86_64-pc-linux-gnu-library/3.1/RcppArmadillo/include" -fpic -O3 -pipe -g -c LS_LocalLaplacian.cpp -o LS_LocalLaplacian.o
g++ -I/usr/share/R/include -DNDEBUG -I"/home/anne/LabWork/qpOASES-3.0.0/include" -std=c++11 -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/home/anne/R/x86_64-pc-linux-gnu-library/3.1/RcppArmadillo/include" -fpic -O3 -pipe -g -c RcppExports.cpp -o RcppExports.o
RcppExports.cpp:241:1: error: ‘SupNetModel’ does not name a type
SupNetModel* train(arma::mat data, arma::mat labels);
^
RcppExports.cpp: In function ‘SEXPREC* SupervisedNetworks_train(SEXP, SEXP)’:
RcppExports.cpp:249:9: error: ‘SupNetModel’ was not declared in this scope
SupNetModel* __result = train(data, labels);
^
RcppExports.cpp:249:22: error: ‘__result’ was not declared in this scope
SupNetModel* __result = train(data, labels);
^
RcppExports.cpp:249:68: error: ‘train’ was not declared in this scope
SupNetModel* __result = train(data, labels);
^
make: *** [RcppExports.o] Error 1
ERROR: compilation failed for package ‘SupervisedNetworks’
* removing ‘/home/anne/R/x86_64-pc-linux-gnu-library/3.1/SupervisedNetworks’
* restoring previous ‘/home/anne/R/x86_64-pc-linux-gnu-library/3.1/SupervisedNetworks’
Exited with status 1.
导致此错误的原因是什么,您认为如何解决?
【问题讨论】:
这不可能是你的头文件。它缺少类定义末尾的终止分号。另外,那是你的 main() 函数吗?如果是这样,#include "SuperModel.h"
在哪里?
已修复错字(不幸的是,我的实际代码中没有错字)。
好的,你现在需要告诉 main 什么是 Train
。你没有告诉main
Train
函数存在。在 C++ 中,所有函数都必须在使用前声明或定义。
心理调试器说:递归标头。
看起来我在写这篇文章时没有将我的预处理器 cmets 包含在 main 中。已编辑!
【参考方案1】:
看起来解决方案很简单。
在测试 train() 函数后,我在 train 函数上方留下了 //[[Rcpp::export]] 标签,它允许 R 访问 train()。删除它处理了错误!
【讨论】:
以上是关于返回在堆上分配的类的实例(C++)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章