ArcaneLight
ArcaneLight

Reputation: 111

Using private variable in class

I'm running into an irritating problem where my program keeps crashing if I try to reference a private variable that I have created in one of my classes. I can't figure out where I am going wrong. Here is the class that calls the class that crashes:

#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();
    }

}
};

This class creates an object of my SchemeList class, which is written out as follows:

#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;
}

};

As soon as I get to line 15 success = "HELLO";, the program crashes with the message

Unhandled exception at 0x00E48B66 in lab2.exe: 0xC0000005: Access violation reading   
 location 0xCCCCCCE4.

I am using Microsoft Visual Studio Express 2012 for Windows Desktop.

Upvotes: 0

Views: 1339

Answers (3)

Tom Tanner
Tom Tanner

Reputation: 9354

Firstly, you're apparently including source code files in headers. This will likely break the one definition rule and go horribly wrong.

Secondly, 's' is not a very good name for a class member. It makes it almost impossible to find uses of it.

Thirdly, I can see nowhere in your code that initialises s. I can see where it gets referenced OK, but as it hasn't been initialised, the effect of dereferencing is undefined, and with luck will merely crash your program, which looks like what is happening.

Upvotes: 0

sdkljhdf hda
sdkljhdf hda

Reputation: 1407

You have not initialized dataLog::s. When you call (*s).process(i, tokens, domain), you get undefined behavior.

Upvotes: 1

Luchian Grigore
Luchian Grigore

Reputation: 258558

First off, the variable schemeList * dataLog::s is never initialized, so accessing it is undefined behavior, which leads to the crash. Most likely calling process on a dangling pointer and attempting to write into some memory you don't own.

Second, don't #include "schemeList.cpp". You're not supposed to include cpp files. Rather, separate declarations & implementations and include a header.

Upvotes: 3

Related Questions