类构造函数,它接受对不同对象的引用,我不想复制该对象
Class constructor that takes a reference to a different object and I would like to not copy the object
我是一名学习 c++ 的学生。
我有两个对象("城市"和"解析器"(,我希望一个对象("解析器"(修改为另一个对象("城市"(。
唯一的"问题"是我必须在另一个构造函数中发送对象("City"((代码显示了我的意思(。
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 中做到这一点。
但自从我发现这种语言以来,每个人都在说必须避免原始指针。
我检查了智能指针,但它们会"删除"我的变量(我的变量来自堆栈,因此我不想删除它(。
我不想复制"解析器"中的"城市"(因为可以避免复制对象?
我知道我可以将 City 对象的引用发送到成员函数"fillCity",但我想知道一个对象是否可以在不复制的情况下容纳另一个对象。
有没有另一种方法可以在不使用原始指针的情况下做到这一点?
提前谢谢。
如果要在控制这些对象的生存期的同时共享对象,可以使用shared_ptr
。因此,一旦释放了对共享对象的所有引用,共享对象将被销毁(即最后一个shared_ptr
-wrapper被破坏(:
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;
}
<</div>
div class="answers"> 在 Parser
构造函数中,通过引用传递 City
参数。但随后您复制对象以将其存储在 _c
中。
您也应该_c
作为参考。
另一种选择(在某个程序员的正确答案之后(是将c作为对P的一些成员函数的引用,例如:
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
是否/何时消失......不是真正的火箭:)而且可以非常方便。
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则