我是一个学生的学习C ++。 我有两个对象(“城市”和“分析器”),我想一个对象(“分析器”)修改到另一个(“城市”)。 唯一的“问题”是,我在其他人的构造函数发送的对象(“城市”)(代码是展示我的意思)。
class City {
public:
City()
: peopleCount { 0 }
{};
int peopleCount;
};
class Parser {
public:
Parser(const char *filename, City &c)
: _filename { filename },
_c { c }
{};
void fillCity() { _c.peopleCount = 3; };
const char *_filename;
City _c;
};
int main(int argc, char *argv[])
{
City c;
Parser p(argv[1], c);
p.fillCity();
std::cout << c.peopleCount << std::endl; // I would like my output to be "3"
return 0;
}
我可以在构造函数发送原始指针做,在C。 但因为我发现这个langage,每个人都在说,原始指针必须避免。 我检查智能指针,但他们将“删除”我的变量(我的变量是栈,基于这个原因,我不想将其删除)。 我不想在“分析器”复制“城市”(因为可以避免复制对象?)。
我知道,我可以把一个城市对象的成员函数“fillCity”的参考,但我想知道,如果一个对象可以容纳另一个物体而不复制它。
是否有另一种方式来做到这一点,而无需使用原始指针?
提前致谢。
在Parser
构造函数中,通过引用传递的City
说法。但你复制到存储在_c
的对象。
你应该让_c
参考为好。
如果您想在有控制下的这些对象的生命时间分享的对象,你可以使用shared_ptr
。因此,共享对象将被破坏,一旦给它的所有引用都被释放(即最后shared_ptr
,包装得到了破坏):
class City {
public:
City()
: peopleCount(0)
{};
int peopleCount;
};
class Parser {
public:
Parser(const char *filename, std::shared_ptr<City> c)
: _filename (filename),
_c (c) {};
void fillCity() { _c->peopleCount = 3; };
const char *_filename;
std::shared_ptr<City> _c;
};
int main(int argc, char *argv[])
{
std::shared_ptr<City> c = std::make_shared<City>();
Parser p("somefilename", c);
p.fillCity();
std::cout << c->peopleCount << std::endl;
return 0;
}
另一种选择(有些程序员花花公子的正确答案之后)在通过C作为的一些普的成员函数,e.g参考:
class Parser {
public:
Parser(const char *filename)
: _filename { filename }
{};
void fillCity(City &c) { c.peopleCount = 3; };
const char *_filename;
};
使用这样的:
int main(int argc, char *argv[])
{
City c;
Parser p(argv[1]);
p.fillCity(c);
std::cout << c.peopleCount << std::endl; // I would like my output to be "3"
return 0;
}
这可能是也可能不是你想要的 - 但如果你只是有一个或少数的功能,这是相当方便易。
在另一点 - 我不会说假冒的指针是如此糟糕,比如你可以用一个指针(默认值是nullptr)至少默认构造再后来传入C
对象。唯一的“问题”是,你必须要小心,C
存在P
的寿命,或者你告诉P
如果/当C
自败......不是真正的火箭沉立新,:),它可以说是相当方便易。