我有C#背景并且在C#工作了很多年..最近,我正在学习C ++并遇到一些困难..
基本上,我正在尝试创建链接类,如下所示。我想将我的类用作struct node中的数据。
如何在C ++中解决此问题?谢谢。
但它说我不能那样用。
class Polynomial{
public:
Polynomial(pair<double, int>);
void add(Polynomial);
Polynomial multiply(Polynomial);
void print();
private:
struct node
{
Polynomial data;
node *link;
}*p;
};
答案 0 :(得分:5)
您的node
结构包含Polynominal
类型的成员变量,但由于node
本身是在Polynominal
内声明的,因此Polynominal
的声明不是在那时完成。
我的印象是你假设C ++中的类与C#一样工作,但他们没有。 C ++不是垃圾收集的,并且在使用类时它不会自动为您管理引用。 C ++中的类更像是C#中的结构,当您在示例中传递或声明它时,它会被值复制。
另一件事:C ++带有STL,其中包含一系列适用于各种事物的模板,包括一个很好的链表(std::list
)。
答案 1 :(得分:3)
几个问题:
Polynomial没有默认构造函数,因此创建它的唯一方法是使用您拥有的自定义构造函数。但是,您的内部结构包含Polynomial类型的对象。应该如何创建?除非在容器的构造函数中专门初始化它们,否则不能在类中嵌入没有默认构造函数的对象。
您的struct包含一个父类类型的对象,您仍然在定义它!如果有的话,你需要将该结构化为自己的类。
一般来说,你似乎做了很多按价值操作。这是非常低效的 - 您应该始终通过引用或指针传递多项式。
答案 2 :(得分:1)
要解决此问题,只需在结构
中使用Polynomial &data;
而不是Polynomial data;
答案 3 :(得分:1)
将其更改为Polynomial *数据;它会工作得很好。其中有关于什么是错的线索。理解这将带来很大的启示。
解释它的一种方法是,在C ++中(与C#不同),Polynomial
和float
在如何分配存储方面表现完全相同。在C#中,你不能new float;
(不要混淆with new Float();
),你可以用C ++。
答案 4 :(得分:1)
EboMike提出的观点都是有效的,但只是为了编译(由于可施工性问题,它仍然无法使用):
class Polynomial{
public:
Polynomial(pair<double, int>);
void add(Polynomial);
Polynomial multiply(Polynomial);
void print();
private:
struct node; // forward declaration creates incomplete type
node *p; // OK to have pointer to incomplete type
};
struct Polynomial::node
{
Polynomial data; // class Polynomial is complete now
node *link;
};