C++ 访问类成员的操作顺序

标签 c++ class pointers operator-keyword

main里的线能行吗?也许其他运营商?一些建议? 我认为操作顺序是这里的问题。是否必须使用 b.addA("P"); b.R("P").ref(b.R("P")); ?

我想将一个对象的引用添加到其他对象并在对象之间建立关系,例如数据库模型。

#include <iostream>
#include <vector>
#include <string>

class A;
class B;

class A{
    std::string _name;
    std::vector<A*> _refs;
public:
    A(std::string="");
    A& ref(A&);
    std::string name() const;
};

class B{
    std::string _name;
    std::vector<A> _as;
public:
    B(std::string="");
    A& addA(std::string);
    A& R(std::string);
};

A::A(std::string nm){
    _name=nm;
}

A& A::ref(A &a){
    for(int i=0; i<_refs.size(); i++)
        if(_refs[i]==&a)
            return a;
    _refs.push_back(&a);
    return a;
}

std::string A::name() const{
    return _name;
}

B::B(std::string nm){
    _name=nm;
}

A& B::addA(std::string nm){
    for(int i=0; i<_as.size(); i++)
        if(_as[i].name()==nm)
            return _as[i];
    _as.push_back(A(nm));
    return _as[_as.size()-1];
}

A& B::R(std::string nm){
    for(int i=0; i<_as.size(); i++)
        if(_as[i].name()==nm)
            return _as[i];
    throw std::string("invaild A");
}

int main(){
    B b;
    b.addA("P").ref(b.R("P"));
    return 0;
}

最佳答案

Can the line in main work?

当然。这里只有两个运算符在起作用,函数调用和引用(点运算符)。如果关联是从右到左,或者函数调用优先于引用,你就会遇到问题。事实并非如此。函数调用和引用具有相同的优先级,关联是从左到右的。这正是您想要的。

但是,您的代码存在问题。它是成员函数 B::A。在类 B 的上下文中,这将 A 的含义从 class A 更改为成员函数 B::A(std: :字符串)。你的代码无法在我的多个编译器上编译,但它确实使用 clang 3.1 编译。 对我来说这看起来像是一个 clang 错误。(附录: 这确实可以用 clang 编译是可以的,因为被违反的规则是那些令人讨厌的规则之一“没有诊断是required”规则。)你的代码是非法的;它(理想情况下)应该无法编译。

该函数更好的名称是 findA。此名称不会与类名冲突,并且可以使代码 self 记录。

旁白:您可能想要让该函数返回一个指针而不是一个引用。异常应该用于异常事件(即错误)。事实上(例如)“Foo”没有在你的 vector 中表示真的值得抛出异常吗?

关于C++ 访问类成员的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12543494/

相关文章:

C++ 运行时动态内存大小

c++ - 如何使用 PKEY_Device_FriendlyName 修复链接器错误

c++ - 字符串数据成员的错误指针 - 获取访问冲突

c - 为什么以及何时应该在 C 中使用指针到指针而不是简单指针?

c++ - 通过使用来自同一类 C++ 的函数内部的指针 vector 访问数据

c++ - 在 C++ 中取消引用 NULL 指针

c++ - 即使在检查是否被零除后浮点异常

java匿名类和同步以及 "this"

javascript - 在javascript类中使用它

C++ 内存管理