将类引用传递给函数

时间:2014-07-01 00:35:23

标签: c++ class struct

我是一名前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

2 个答案:

答案 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 = &sc;
printStruct(psc);

const

的问题

为了调用这些参数的方法,这些方法必须是const(或删除参数类型的const说明符)

示例一,删除const

void printStruct(SampleClass*);

void printStruct(SampleClass&);

示例二,添加const

class SampleClass
{
public:
  std::string GetString1() const;
};