我遇到了一个令人烦恼的问题,如果我尝试引用我在一个类中创建的私有(private)变量,我的程序就会不断崩溃。我不知道哪里出了问题。这是调用崩溃类的类:

#include <stack>
#include <fstream>
#include <ostream>
#include <cstdlib>
#include <string>
#include <set>
#include "schemeList.cpp"

using namespace std;

class dataLog
{
public:
stack<string> commands;
set<string> domain;
processor tokens;
int nextToken;
schemeList * s;
dataLog(stack<string> s, ofstream * out, processor p, int location)
{
    commands = s;
    tokens = p;
    nextToken = location;
    commands.push("<Query List>");
    commands.push(":");
    commands.push("Queries");
    commands.push("<Rule List>");
    commands.push(":");
    commands.push("Rules");
    commands.push("<Fact List>");
    commands.push(":");
    commands.push("Facts");
    commands.push("<Scheme List>");
    commands.push(":");
    commands.push("Schemes");
    checkNext();
}

void checkNext()
{
    for(int i = 0; i < tokens.tags.size(); i++)
    {
        if(commands.top().compare(tokens.tags[i].getName())!=0)
        {
            if(commands.top().find("<")==0)
            {
                if(commands.top().compare("<Scheme List>")==0)
                {
                    int output = (*s).process(i, tokens, domain);                       string hi = (*s).toString();

                }
            }
        }
        commands.pop();
    }

}
};

此类创建我的SchemeList类的对象,其写出如下:
#include "schemes.cpp"
#include <cstdlib>
#include <string>
#include <set>
using namespace std;

class schemeList
{
private:
string success;

public:
int process(int number, processor p, set<string> domain)
{
    success = "HELLO";
    return 13;
}

string toString()
{
    return success;
}

};

当我到达第15行success = "HELLO";时,程序崩溃并显示以下消息
Unhandled exception at 0x00E48B66 in lab2.exe: 0xC0000005: Access violation reading
 location 0xCCCCCCE4.

我正在使用用于Windows桌面的Microsoft Visual Studio Express 2012。

最佳答案

首先,变量schemeList * dataLog::s从未初始化,因此对其进行访问是 undefined 的行为,这将导致崩溃。最有可能在悬空指针上调用进程,并尝试写入您不拥有的某些内存。

第二,不要#include "schemeList.cpp"。您不应该包含cpp文件。而是单独的声明和实现,包括头。

10-08 19:59