我在一项相对简单的任务中遇到了很多麻烦。我有两个头文件input.h
和grains.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;
}
答案 0 :(得分:1)
我在猜执行时:
input->from_file(fname.c_str());
grains->get_pars();
您希望in_grains
的{{1}}可用input
。 grains->grains
和input
是两个不同的对象。尚未在对象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