为什么声明时无法初始化类对象?

时间:2019-05-07 15:26:49

标签: c++ initialization operator-overloading variable-declaration

我为特定的类重载了赋值运算符,此后我很快发现了一个问题。

在声明类对象期间,如果我使用已经存在的另一个对象对其进行初始化,

       objectType object1;
       objectType object2 = object1;

程序将终止,并显示一条消息。program.exe在运行期间已停止工作。

但是,如果我将声明和初始化步骤分开,

        objectType object1, object2;
        object2 = object1;

它将运行正常。

如果我们可以使用简单的数据类型做到这一点,

        int x = 6;
        int y = x;

为什么我们不能对类对象执行此操作?我希望我的问题很清楚,并且已经在具有相同.exe的其他计算机上测试了此结果,从而停止了工作。

编辑: 这是我的代码。该类本身是一个堆栈。

    #include <iostream>
    using namespace std;

    struct nodeType
    {
        int info;
        nodeType *link;
    };

    class objectType
    {
        public:

            const objectType& operator=(const objectType& otherObject)
            {
                if(this != &otherObject)
                {
                    copyObject(otherObject);
                }
                return *this;
            }

            void initialize() //Initialize the stack
            {
                nodeType *temp; 

                while(stackTop != nullptr)
                {
                    temp = stackTop;
                    stackTop = stackTop->link;
                    delete temp;
                }
            }

            objectType(const objectType& otherObject) //Copy constructor
            {
                copyObject(otherObject);
            }

            objectType() //Constructor
            {
                stackTop = nullptr;
            }

            ~objectType() //Destructor
            {
                initialize();
            }

        private:
            nodeType* stackTop;

            //Copy function to implement copy constructor and overload assignment operator
            void copyObject(const objectType& otherObject)
            {
                initialize();

                if(otherObject.stackTop != nullptr)
                {
                    nodeType *current, *last, *newNode;

                    current = otherObject.stackTop;

                    stackTop = new nodeType;
                    stackTop->info = current->info;
                    stackTop->link = nullptr;

                    last = stackTop;
                    current = current->link;

                    while(current != nullptr)
                    {
                        newNode = new nodeType;
                        newNode->info = current->info;
                        newNode->link = nullptr;

                        last->link = newNode;
                        last = newNode;

                        current = current->link;
                    }
                }
            }
    };

    int main()
    {
        objectType object1;
        objectType object2 = object1;
        return 0;
    }

用调试器测试它之后,我发现问题是析构函数。据我所知,当对象超出范围时将调用析构函数。在这种情况下,对象是否超出范围?

P.S。现在可以将此代码视为MCVE吗?是的,重现代码确实可以帮助我找出问题的真正根源。

1 个答案:

答案 0 :(得分:1)

这意味着您的select distinct w.word, C.SumOfPoints as sumofpoints from words w CROSS APPLY (SELECT SUM(points) AS SumOfPoints from words w2 WHERE w2.word like '%' + w.word + '%') C 的副本构造函数实现已损坏,但是有一个有效的副本分配运算符。

通过使用任何其他类型(例如objectType)来证明自己不是类的功能。

很遗憾,我们无法告诉您如何损坏,因为我们看不到它;启动调试器并破解!