我正在学习C ++,我不能通过使用指针访问引用吗? (举个例子)

时间:2017-08-04 08:06:17

标签: c++ pointers reference

好的,我用C已经3年了。 我的专业是嵌入式系统工程 几天前我对图像处理很感兴趣。 所以我正在学习C ++。

我想在使用复制构造函数时更改最后一个字符。 喜欢这些 - > Cannon1 Cannon2 Cannon3(Cannon只是名字) 所以我像在C中一样使用了指针。

Photon_Cannon::Photon_Cannon(int x, int y, char *cannon_name)
{
    int i = 0;
    hp = shield = 100;
    coord_x = x;
    coord_y = y;
    damage = 20;
    name = new char[strlen(cannon_name) + 1];
    strcpy(name, cannon_name);
}

这是原始代码(这可以正常工作)

我附加了复制构造函数部分的一些代码。

while (*name!=NULL) {
        name++;
    }
    *name+=1;

但它不起作用! :(

帮帮我......

2 个答案:

答案 0 :(得分:2)

尝试使用std::string代替char*

Photon_Cannon::Photon_Cannon(int x, int y, const std::string& cannon_name)

将成员变量name更改为std::string,然后您可以轻松指定字符串

name = cannon_name;

然后更改最后一个字符

name[name.length() - 1] = '2';

或者

    name.pop_back();
    name += "2";

不要忘记包含字符串。

或者使用char *

name[strlen(name) - 1] = '2';

别忘了检查数组/字符串的大小,name.length() > 0),(int)strlen(name)> 1,......

我建议你阅读一些c ++教程 C++ strings

Iam new on stackoverflow,所以我希望它能帮到你:)。

答案 1 :(得分:0)

这不是作为答案,只是作为菲利普已经给出答案的旁注(以及那里的评论):

void f(std::string const& s)

这是传递std :: string对象的通常的方法,因为它避免了创建(花费运行时和内存)的不必要的副本。如果您确实想要修改字符串(对于传递给f的字符串对象,可以看到更改),请不要使用const修饰符。

现在我们有一个特例:

void f(std::string const& s)
{
    std::string ss(s); // creates a COPY!

    // modify the copy ss...
}

显然,要修改副本,但传递给原始字符串对象的更改不可见。如果我们不再需要访问原始字符串(s), ,那么 然后,按值传递字符串是有意义的:

void f(std::string /*const&*/ s) // creates the COPY already when passing
{
    /* std::string ss(s); // creates a COPY! */ // <- don't need it any more

    // modify the COPY s now...
}

附注:真正留下const引用作为上面的评论(/*const&*/)将表达(并且应该足够)通过值传递故意 ......