我是新编程的C ++,我收到一个错误,我不知道如何解决。我有一个类单元格,然后我尝试创建一个指向这个类的指针数组,如下所示:
#include <iostream>
using namespace std;
class cell{
public:
cell(int nx, int ny);
void allocatePtr();
float getT() {return T ;}
float T=10;
int nx, ny;
float *ptrW, *ptrE, *ptrN, *ptrS;
};
int main() {
cell **mesh = new cell *[10];
for (int i =0; i<10; i++)
mesh[i]= new cell(10,10);
cout<<mesh[1]->T<<endl;
return 0;
}
但是当我在带有Xcode的MacBook Pro上运行时,我得到了这个错误:
Undefined symbols for architecture x86_64:
"celda::celda(int, int)", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
提前致谢。
答案 0 :(得分:2)
您没有实现您调用的构造函数 - 这就是您收到链接器错误的原因。解决这个问题:
class cell
{
public:
cell(int nx, int ny)
: nx(nx), ny(ny)
{ }
void allocatePtr();
float getT() { return T ; }
float T = 10;
int nx, ny;
float *ptrW, *ptrE, *ptrN, *ptrS;
};
修改强>
很少解释这个新代码的作用。让我们创建一个类:
class Sample
{
protected:
int value;
float factor;
void* data;
public:
Sample(); //(1)
Sample(const Sample& origin); //(2)
Sample(int v, float f, void* d); //(3)
};
此课程有一些成员:int
,float
和void*
。它还定义了一些构造函数:
(1)是默认构造函数,
(2)是复制构造函数,
(3)是我们的自定义构造函数。
如您所知,每个成员都应该在构造函数中正确初始化,因此每个对象都是在有效状态下创建的。
我们可以通过两种方式为成员分配初始值。让我们使用两种方法定义构造函数:
1)使用赋值运算符。
Sample::Sample()
{
this->value = 0;
this->factor = 0.0f;
this->data = nullptr;
}
Sample::Sample(const Sample& origin)
{
this->value = origin.value;
this->factor = origin.factor;
this->data = origin.data;
}
Sample::Sample(int v, float f, void* d)
{
this->value = v;
this->factor = f;
this->data = d;
}
2)使用初始化列表:
Sample::Sample()
: value(0)
, factor(0.0f)
, data(nullptr)
{ }
Sample::Sample(const Sample& origin)
: value(origin.value)
, factor(origin.factor)
, data(origin.data)
{ }
Sample::Sample(int v, float f, void* d)
: value(v)
, factor(f)
, data(d)
{ }
第二个解决方案总是首选,因为每个成员都被初始化无论如何(想象一下,总有这样的初始化列表,即使你没有定义它 - 在这种情况下编译器会初始化所有成员为每个成员调用默认构造函数),因此在构造函数体内使用赋值,我们浪费了以有效的方式创建对象的能力。
值得一提的是,某些类型的成员必须进行初始化。示例:参考。考虑:
struct S
{
public:
int& xr; //'x' is a reference!
public:
S(const int& x);
};
//This won't even compile, because compiler does not know, how initialize 'rx'.
S::S(const int& x)
{
this->xr = x; //This is also an error - references cannot be reassigned.
}
//Fine
S::S(const int& x)
: xr(x)
{
}
了解更多on this page。