【问题标题】:Passing class reference to function将类引用传递给函数
【发布时间】:2014-08-21 11:04:04
【问题描述】:

我是一名前 c 程序员,过去几年一直在使用 python。我现在正在尝试理解 C++ 对象编程。我创建了一个包含结构的类。我想将对类的引用传递给函数。我已经阅读了几篇关于通过引用传递的文章,如下所示:

passing object by reference in C++

是否可以将类引用传递给函数,或者这是在 c++ 中无法完成的事情?

我正在尝试将对类的引用传递给打印 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:语法错误:在 '&' 之前缺少 ',' 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

【问题讨论】:

  • 您在执行此操作时遇到了什么问题?在我看来,您正在寻找stackoverflow.com/questions/57483/…
  • 好吧,那个时候还没有声明这个类。这与 C 中的相同。
  • 请编辑您的帖子并在此处包含确切的错误消息而不是评论。
  • printStruct(psc); 应该只是 printStruct(sc);。你不需要指针。
  • 是的。声明指向类的指针的行有错误。它应该如下所示: SampleClass * psc = &sc;

标签: c++ class struct


【解决方案1】:

这里有两个问题。第一个是您传递的是指针而不是引用或对象实例。您可以通过在将指针作为参数传递时取消引用指针来解决此问题只传递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;
}

【讨论】:

  • 这不会在 Visual Studio 下编译。请参阅上面的错误消息。
  • 你是个天才。感谢您发现 const 问题。这正是我所需要的。
  • 一种解决方案比另一种更好吗?两种解决方案都有效。删除函数声明中的 const 关键字或将 const 关键字附加到函数声明中,如下所示: std::string GetString1() const;再次感谢。
  • 如果成员函数 const 不打算修改它们被调用的对象,则更习惯于声明它们。在这种情况下,将其声明为 const 正是您想要做的。
【解决方案2】:

更新 您提到它由于 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;
};

【讨论】:

  • 我已经尝试过这个解决方案。这是行不通的。我一定错过了一些愚蠢的东西。
  • Obvlious 船长找到了解决方案。见下文
  • 感谢您的帮助。这是一个让我发疯的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2019-10-11
  • 2022-01-22
相关资源
最近更新 更多