无法从单独的C ++类访问类的成员

时间:2015-01-08 20:42:24

标签: c++

我在一项相对简单的任务中遇到了很多麻烦。我有两个头文件input.hgrains.h,两者都有定义的类。我在下面列出了这个项目的所有头文件和源文件。

我的问题是,当input->from_file(fname)执行时,打印到屏幕上的值是正确的,让我们说它是4。然后当它在grains->get_pars()上移动时,打印到屏幕的值是垃圾,通常为~605937280。我知道这种类型的垃圾值表示未设置变量,但我不明白它是如何设置的。

我的目标是让input.cpp读取某些参数的文件,这些参数对grains.cpp很重要,然后传递它们。我认为派生类可以解决问题,但有些东西不能正常工作。任何关于我做错的提示都将不胜感激。此外,除了我提出的目标之外,任何有关实现这一目标的建议都非常受欢迎,谢谢。注意,显示的代码编译得很好。

//input.h
#ifndef Input_H
#define Input_H
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <cstring>

class Input {
  protected:
    int in_grains;
  public:
    void from_file(std::string);
};
#endif

//grains.h
#ifndef Grains_H
#define Grains_H
#include "input.h"

class Grains : protected Input {
  protected:
    int grains;
  public:
    void get_pars(void);
};
#endif


//input.cpp
#include "input.h"

void Input::from_file(std::string infile)
{ 
    std::ifstream input(infile.c_str());
    std::istringstream iss;
    std::string line, keyword;

    char arg1[50], arg2[50], arg3[50];

    while(std::getline(input,line)) {
        iss.clear();
        iss.str(line);
        iss >> keyword >> arg1 >> arg2 >> arg3;
        if ((keyword == "GRAINS") || (keyword == "Grains") || (keyword == "grains")) {
            this->in_grains = atoi(arg1);
        }
    }
    fprintf(stdout,"%i\n",in_grains );
}


//grains.cpp
#include "grains.h"

void Grains::get_pars(void)
{ 
    this->grains = in_grains;
    fprintf(stdout,"%i\n",grains );
}


//main.cpp
#include "input.h"
#include "grains.h"

int main(int nargs, char *argv[])
{ 
    Input obj1;
    Input *input = &obj1;

    Grains obj2;
    Grains *grains = &obj2;
    std::string fname = argv[1];

    input->from_file(fname.c_str());
    grains->get_pars();

    return 0;

}

1 个答案:

答案 0 :(得分:1)

我在猜执行时:

input->from_file(fname.c_str());
grains->get_pars();

您希望in_grains的{​​{1}}可用inputgrains->grainsinput是两个不同的对象。尚未在对象grains上设置in_grains

也许您打算使用:

grains

但是,要使用它,您必须使int main(int nargs, char *argv[]) { Grains obj; Input *input = &obj; Grains *grains = &obj; std::string fname = argv[1]; input->from_file(fname.c_str()); grains->get_pars(); return 0; } 成为Input基类public,而不是Grain基类。

protected