C ++中的嵌套类型

时间:2010-09-08 15:45:21

标签: c++

我有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;
};

5 个答案:

答案 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#不同),Polynomialfloat在如何分配存储方面表现完全相同。在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;
};