我是一名前C程序员,并且在过去的几年里一直在使用python。我现在正试图理解c ++对象编程。我创建了一个包含结构的类。我想将类的引用传递给函数。我已经阅读了几篇关于通过引用传递的文章,如下所示:
passing object by reference in C++
是否可以将类引用传递给函数,或者这是否可以在c ++中完成?
我试图将对类的引用传递给print printStruct函数。 这是我的例子:
#include "stdafx.h"
#include <string>
#include <iostream>
class SampleClass
{
public:
struct TestStructType {
std::string string1;
};
SampleClass();
std::string GetString1();
private:
TestStructType PrivateVar;
};
SampleClass::SampleClass()
{
PrivateVar.string1 = "String 1";
};
std::string SampleClass::GetString1() { return PrivateVar.string1; };
void printStruct(SampleClass&);
int _tmain(int argc, _TCHAR* argv[])
{
SampleClass sc;
std::cout << sc.GetString1() << std::endl;
printStruct(sc);
return 0;
};
void printStruct(SampleClass& ssc)
{
std::cout << "The String is: " << ssc.GetString1() << std::endl;
};
错误讯息: 错误1错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int c:\ users \ visual studio 2013 \ projects \ pass class \ pass class \ pass class.cpp 8 1 Pass Class
错误2错误C2143:语法错误:缺少&#39;,&#39;之前&#39;&amp;&#39; c:\ users \ visual studio 2013 \ projects \ pass class \ pass class \ pass class.cpp 8 1 Pass Class
5 IntelliSense:对象具有与成员函数不兼容的类型限定符 对象类型是:const SampleClass c:\ Users \ Visual Studio 2013 \ Projects \ Pass Class \ Pass Class \ Pass Class.cpp 41 37 Pass Class
答案 0 :(得分:2)
这里有两个问题。第一个是传递指针而不是引用或对象实例。您可以通过在将参数作为参数传递时取消引用指针来解决此问题,或者只传递sc
而不是psc
。
SampleClass sc;
SampleClass *psc = &sc
printStruct(*psc);
// ^ - dereference the pointer.
或
SampleClass sc;
printStruct(sc);
第二个问题是您在const限定的实例上调用非const限定的成员函数。由于GetString1
不会修改任何成员变量,因此您可以通过声明const
来轻松解决此问题。
class SampleClass
{
std::string GetString1() const;
};
std::string SampleClass::GetString1() const
{
return PrivateVar.string1;
}
答案 1 :(得分:0)
<强>更新强> 你提到它由于const而无法编译。那是因为你将引用声明为const引用而GetString1不是const。有关选项,请参阅本答案的结尾。
使用引用和指针类似,它们指的是实际对象的地址。存在一些差异,例如引用不能引用(将是段错误)nullptr也不能保留未定义(意味着必须在构造点处分配引用)。
当您不想复制对象时,通常按地址(指针)或引用(通常是人们更喜欢指针)进行传递。虽然这两种类型在幕后表现相似,但两者的语法是分开的。你的方法声明:
void printStruct(const SampleClass&);
期待引用,并且您正在传递指针。
SampleClass * psc;
你有两个选择,要么指望一个指针,要么传递一个对象(将使用它的引用)。
示例一,传递引用:
printStruct(sc);
示例二,传递指针:
void printStruct(const SampleClass*);
// in main
SampleClass* psc = ≻
printStruct(psc);
const
的问题为了调用这些参数的方法,这些方法必须是const(或删除参数类型的const说明符)
示例一,删除const
void printStruct(SampleClass*);
或
void printStruct(SampleClass&);
示例二,添加const
class SampleClass
{
public:
std::string GetString1() const;
};