gpt4 book ai didi

c++ - 函数参数的类型转换

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:40 26 4
gpt4 key购买 nike

class A{
};

class B{
public:
B();
B(const &A);
};

void foo(A &a){

}

int main(){
B b;
foo(b); //error: invalid initialization of reference of type ‘A&’ from expression of type ‘B’
return 0;
}

在上面的代码中,我有一个编译错误

错误:从类型“B”的表达式对类型“A&”的引用的初始化无效

错误可以通过foo()函数重载来解决。但是,您对我如何解决该问题有任何其他建议吗?

函数 foo(A &a) 不使用参数“a”作为输入。参数“a”只是函数 foo(A &a) 的输出。

谢谢。

最佳答案

有很多选择...如果不了解您的程序正在尝试什么,就很难知道推荐什么。我们对 A 和 B 之间的逻辑关系的一点洞察是:

  • B 的构造函数中只有一个需要对 A 对象的非常量引用
  • foo() 旨在与 A 或 B 一起工作

这意味着指向 A 的指针可能保存在 B 中,但引出了一个问题:foo() 应该与所有 B 一起工作(如果在构造时没有提供,则可能使用默认构造的 A)还是仅与那些构造的 B 一起工作引用 A?

设计选项包括:

  • 从 A 派生 B(但您的默认构造函数建议 B 可以存在而无需“绑定(bind)”到 A)
  • 添加A& get_A()和/或 const A& get_A() const成员到 class B , 然后调用 foo(b.get_A());
    • 使用 operator A&() 隐含地执行此操作和 operator const A&() const
    • 你可能更喜欢A* get_A()等,如果 A 是可选的
  • template <class A_or_B> foo(A_or_B&)如果 A 和 B 为 foo 提供正确的成员/语义以在其中一个上工作
  • 重载 foo,为每种类型提供不同的实现

探索性代码:

#include <iostream>

struct A
{
int n_;
};

void foo(A& a)
{
a.n_++;
}


struct B
{
// e.g. B() : p_a_(new A), owner_(true) { } ?
// ~B() { if (owner_) delete p_a_; }
B(A& a) : p_a_(&a) { }

operator A&() { return *p_a_; }

A* p_a_;
};

int main()
{
A a;
a.n_ = 2;
B b(a);
foo(a);
foo(b);
std::cout << a.n_ << '\n';
}

关于c++ - 函数参数的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com