2009-11-23 50 views
1

我想初始化我的类的私有变量传递一个常量字符串& aString它作为参数。C++在方法中传递const字符串引用?

这里是我的方法:

void Image::initWithTextureFile(const std::string &inTextureName) 
{ 
    Texture2D *imTexture = TEXTURE_MANAGER->createTexture(inTextureName); 

    if(imTexture) 
    { 
     texture = imTexture; 
     scale = 1.0f; 
     name = inTextureName; //name is a private string variable inside my class 
     initImplementation(); 
    }else { 
     printf("Could not load texture when creating Image from file %s\n",inTextureName.c_str()); 
    } 
} 

我的问题是下面的,当我把这种方法,我这样做:

myInitializer.initWithTextureFile("myFile.bmp"); 

当我的initWithTextureFilename变量的范围内取值为inTextureName。在这个例子中,如果我cout << name << endl;initWithTextureFile我会得到"myFile.bmp"

但是,当我离开这个功能的范围,name失去它的价值,所以,当我cout << name << endl;我得到什么打印到控制台上。

任何人都可以指出我在这里发生了什么?

名称声明:

private: 
    std::string name; 
+3

没有足够的代码来回答问题。在封闭作用域(类成员,全局变量)中查找本地'name'变量。 – 2009-11-23 21:36:41

+0

这将有助于查看名称声明。另外,检查initImplmentation()是否执行任何命名。 – progrmr 2009-11-23 21:38:14

+0

我刚刚添加了名称变量声明。 – Goles 2009-11-23 21:38:51

回答

3

如果你的类范围之内,cout << name编译的话,那意味着你有一个名为name另一个变量,这是什么被拾起。如果你想在课堂以外引用它,你必须想出一个方法来导出它。例如,您可能有一个成员函数,如const std::string &GetName() { return name; }

+0

@MrGando表示他正在访问名称以外的功能范围,不在类范围之外。 – 2009-11-23 23:14:56

+0

为什么这是公认的答案?它没有指出发生了什么问题...... – 2011-11-22 14:28:24

0

的问题可能有一个同名变量做的:它是一个指针或裁判字符串,而不是一个简单的字符串?

+0

只是添加了名称的声明。 – Goles 2009-11-23 21:37:50

-1

'name'是如何声明的?看起来也许它被声明为引用而不是对象。

+0

它会有什么不同?上述分配应该将该值复制到所引用的任何内容。 – AnT 2009-11-23 21:54:44

+0

也许我的C++太生锈了。但是,如果你这样做:“std :: string & name; name = inTextureName;”然后inTextureName超出范围,将不会指向堆栈上随机的东西? – 2009-11-23 22:52:12

+0

@Moishe:由于您的代码无效,因此无法说出会发生什么。在C++中,如果不初始化它,就不能定义引用。即你可以定义'std :: string&name'。它根本不会编译。 – AnT 2009-11-24 00:25:00

-1

尝试:

name = std::string(inTextureName); 
+0

这没有奏效...... – Goles 2009-11-23 21:41:09

+0

查看initImplementation并确认它不是覆盖名称。您发布的代码*应该*有效;我已经看到了怪异,就像你用一些编译器/库描述的那样,它有一个错误的引用计数的字符串实现,但通常一个明确的实例化修复了这个问题。 – Skirwan 2009-11-23 21:58:09

1

这应该工作。你确定它没有被修改到别的地方吗,比如在initImplementation中?

3

您要么在描述中忽略某些内容,要么没有显示可帮助解决问题的适当代码。

这工作:

#include <iostream> 
#include <string> 

using namespace std; 

struct A 
{ 
    void f(const string& str) { name = str; } 
    void g() { cout << name << endl; } 

    string name; 
}; 

int main() 
{ 
    A a; 
    a.f("test"); 
    a.g(); 
} 

输出:

test 
+0

为什么需要const,因为const意味着'这个值不会改变'? (我测试没有它,并得到一个链接器:无法解析的外部错误,所以我知道它是必需的 - 我只是不明白为什么) – 2012-12-30 09:52:11

0

这里唯一合理的解释是,您必须使用两个不同的name对象。您声明为类成员的那个人应该在退出该方法时保留其值。只是在课堂之外的方法,你必须打印一个完全不同的name,这是空的。

0

我打算说一些关于短期堆栈对象的事情,但我意识到这是错误的。它可能与从DLL导出包含类有关。

如果是的话,你可能会发现这样的警告:

c:\yourclass.h(7): warning C4251: 'YourClass::name_' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'YourClass' 

This thread介绍更多。

相关问题