类构造函数,它接受对不同对象的引用,我不想复制该对象

Class constructor that takes a reference to a different object and I would like to not copy the object

本文关键字:对象 引用 复制 我不想 构造函数      更新时间:2023-10-16

我是一名学习 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 对象。唯一的"问题"是你需要小心CP的一生中存在,或者你告诉P C是否/何时消失......不是真正的火箭:)而且可以非常方便。