2013-03-04 17 views
0

我有一个需要改变外部实例化对象的方法。我一直试图引用参数中的对象,这显然不起作用。这是我有:将引用传递给对象以进行突变C++

#include <iostream> 
#include <cstdlib> 
#include "Character.h" 

using namespace std; 

class TesterClass { 
public: 
    void printStuff(); 
    TesterClass(Character& userChar); 
private: 
    Character& character; 
}; 

TesterClass::TesterClass(Character& userChar) 
{ 
    character = userChar; 
} 
int main() { 
    Character userCharacter; 
    TesterClass tester(userCharacter); 
    return 0; 
} 

我的问题是如何可以使用实例化测试仪类通过参数传递编辑字符对象。我在C++方面非常新,我已经阅读了每个可以感知的参考和点传递的定义,而且它似乎不想单击。

+0

请参阅[初始化列表(http://www.cplusplus.com/forum/articles/17820/) – pauld 2013-03-04 18:16:24

+1

见http://stackoverflow.com/questions/6576109 /初始化参考合构造-C?lq = 1 – pauld 2013-03-04 18:19:30

回答

3

你的构造应该是:

TesterClass::TesterClass(Character& userChar):character(userChar){}

另见this question

为了解决这个评论,这里的地方的值被修改的示例代码:

#include <iostream> 
#include <cstdlib> 

typedef char Character; 

using namespace std; 

class TesterClass { 
public: 
    void printStuff(); 
    TesterClass(Character& userChar); 
private: 
    Character& character; 
}; 

TesterClass::TesterClass(Character& userChar):character(userChar) 
{ 
} 

void TesterClass::printStuff() { 
    cout << character << endl; 
    cout << ++character << endl; 
} 

int main() { 
    Character userCharacter = 'a'; 
    TesterClass tester(userCharacter); 
    tester.printStuff(); 
    cout << userCharacter << endl; 
    ++userCharacter; 
    cout << userCharacter << endl; 
    tester.printStuff(); 
    return 0; 
} 

输出是

a 
b 
b 
c 
c 
d 
+0

原始对象userCharacter不会根据我的测试通过初始化列表进行修改。任何其他实现? – user2130768 2013-03-04 20:13:04

1

我以前的答案/评论同意 - 你真的应该使用初始化列表中的构造函数。问题是你的数据成员是通过初始化列表初始化的(这发生在调用构造函数的主体之前)。就你而言,你有一个Character&作为成员。既然这是一个参考,它必须分配一些东西。我不确定你正在使用哪种编译器,但是AFAIK代码甚至不应该编译。

什么,你可能寻找的是通过参考在主法,如:

int main() 
{ 
    Character userCharacter; 

    // Notice the use of the &-operator 
    TesterClass tester(&userCharacter); 
    return 0; 
} 

在这一点上,你不再谈论Character -instance,但内存的实例的地址。所以,由于你传递的是mem地址,它实际上是你需要的指针,而不是引用。 (例如,userCharacter.SomeMethod()(&userCharacter)->SomeMethod()同义,其中&参考和->解引用)。

相反,你可以写你的TesterClass为:

class TesterClass 
{ 
public: 
    void printStuff(); 
    TesterClass(Character* userChar); 
private: 
    Character* character; 
}; 

TesterClass::TesterClass(Character* userChar) 
    : character(userChar) // <- Notice the init-list 
{} 

这样一来,在你TesterClass情况下,你必须指向其中userChar -instance所在的同一个内存地址的指针。

作为一个注释:虽然userCharacter是一个局部变量,这意味着它在超出范围时会被销毁。在这种情况下,它不是一个真正的问题,因为tester也是本地的。但是如果你不习惯使用指针 - 只是谨慎的话。确保你永远不会传递指针(因为你将地址存储在一个类成员中)到一个TesterClass对象,这个对象超出了你传递的引用变量的范围。这会给你一个悬挂的指针。

我希望可以帮助你:)

+0

您的解决方案有效,但您不能使用引用来改变该Character实例的注释是错误的。 – 2013-03-05 14:00:58

+0

啊是的。看到你的解决方案,当然你是对的 - 你可以改变实例。我编辑了我的答案。感谢您指出。 – Lavesson 2013-03-05 14:30:14