1

此代码使用 while 循环来获取用户输入并执行适当的命令 - 为了简洁起见,我将其减少为 2 个命令。
正确创建了 Oblock 对象(命令“O”),以及指向基类的指针。看来对这两个对象的调用也可以正常工作。但是,在返回 while 循环后,指向对象的指针似乎丢失了,并且尝试访问其成员(命令“t”)会导致段错误。我已经包含了下面的示例代码 - 我的问题是之后。

#include<vector>
#include<iostream>
#include<string.h>

using namespace std;

class Tetramino {
    private:
        int squareSize;
        vector<string> myShape;
    public:
        void setValues(int size) {
            squareSize = size;
            myShape = vector<string> ((size*size), ".");
        }
        string getValues(int i) {
            return myShape[i];
        }
        int getSize() {
            return squareSize;
        }
};

class Oblock : public Tetramino {
    public:
    Oblock() {
        setValues(2);
    }
};

main () {
    string input;
    bool runProgram = true;
    Tetramino *pBlock;

    while (runProgram) {
        cin >> input;
        if (input == "O")
            {
                Oblock myBlock;
                cerr << "0thi: " << myBlock.getValues(0) << endl;
                Tetramino *pBlock = &myBlock;
                cerr << "0thi: " << pBlock->getValues(0) << endl;
            }
        if (input == "t")
            {
                cerr << "0thi: " << pBlock->getValues(0) << endl;
            }
        }
    return 0;
}
  • 对象是否在退出 if 语句时解构?
  • 是否有更好的方法来重复获取用户输入?

提前感谢您的任何建议!我搜索了与此类似的问题,但找不到适合我需要的问题。

4

4 回答 4

3

Tetramino *pBlock在其范围内是本地的。您正在mainif.

此外,myBlock它是本地的并且将被破坏 - 你将有一个悬空指针。你应该分配new(和delete...)

而不是Tetramino *pBlock = &myBlock;pBlock = new Oblock;您处理“O”输入(以及delete pBlock前一个输入的句柄)时执行。

于 2014-05-17T05:12:02.333 回答
1
 if (input == "O")
 {
     Oblock myBlock;
     cerr << "0thi: " << myBlock.getValues(0) << endl;
     Tetramino *pBlock = &myBlock;
     cerr << "0thi: " << pBlock->getValues(0) << endl;
 }

}具有自动存储持续时间的对象(通常称为函数局部变量)的生命周期从其声明后开始,到最近的封闭块标记的末尾结束。somyBlock在这个 if 语句的末尾被销毁,并且不能再次使用。

另请注意,您已经声明了两个不同的指针,名为pBlock. 分配内部的对前面的没有任何作用,它仍然是未初始化的。

于 2014-05-17T05:12:50.637 回答
1

回答你的第一个问题:是的,声明

Oblock yblock;

在堆栈上创建 Oblock 的实例。当代码离开相应的块时它被销毁,因此任何指向它的指针在此之后都变得无效。要创建一个随心所欲new地存在的对象,请使用在堆上创建对象。

于 2014-05-17T05:15:27.067 回答
0

myBlock您的指针在超出范围(语句关闭的位置)后变为垃圾,if这将在您稍后尝试访问它时导致分段错误

if(input == "O"){
    Oblock myBlock;
}
^^^^ right here myBlock becomes garbage

此外,如果用户在“O”之前输入“t”,则会导致分段错误,因为他们将尝试访问未初始化的指针。你可能应该看看。

于 2014-05-17T05:29:31.627 回答