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

问题描述 投票:3回答:3

我是一个学生的学习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”的参考,但我想知道,如果一个对象可以容纳另一个物体而不复制它。

是否有另一种方式来做到这一点,而无需使用原始指针?

提前致谢。

c++ pointers
3个回答
2
投票

Parser构造函数中,通过引用传递的City说法。但你复制到存储在_c的对象。

你应该让_c参考为好。


3
投票

如果您想在有控制下的这些对象的生命时间分享的对象,你可以使用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;
}

2
投票

另一种选择(有些程序员花花公子的正确答案之后)在通过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自败......不是真正的火箭沉立新,:),它可以说是相当方便易。

© www.soinside.com 2019 - 2024. All rights reserved.