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

标签 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;

}

最佳答案

我猜当你执行时:

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

您期待的是 in_grains来自 input可用为 grains->grains . inputgrains是两个不同的对象。 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基类。

class Grains : public Input {

关于c++ - 无法从单独的类 C++ 访问类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27849148/

相关文章:

c++ - 如何打印出字符串的某一部分

c++ - 使用C++中的结构计算形状周长的问题

c++ - 使用 std::lock (c++11) 的大量 CPU 负载

c++ - 从 boost::array 更改为 std::array 时出现错误

c++ - 如何用QPainter绘制单色椭圆(无黑边)

c++ - Qt : send AT command to GPRS modem

c++ - 使用 QComboBox 时 QMainWindow 崩溃

c++ - 使用数组实现一个简单的队列

c++ - 通用 lambda 的编译器推导类型

java - `n` 一袋沙子并插入盒子,算法