命名空间中的类和该类的全局 GET 和集问题

class inside namespace and global get and set of that class issue

提问人:Hrco69 提问时间:4/13/2023 更新时间:4/13/2023 访问量:40

问:

我无法访问在类中声明的私有成员 namespace::class

你知道如何实现我在网上搜索,却找不到任何解决我问题的东西吗?

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <string>
#include <ctime>
#include <iomanip>
#include <memory.h>
#define cahr char //anti-disleksija
#define enld endl //anti-disleksija
using namespace std;

// int getCijena(Osoba& a); ---> tryed prototype
namespace Punoljetna_osoba {
    class Osoba {
        int starost;
    public:
        string ime, Prezime;
        friend int ::getCijena(Osoba& a);
        void setStarost(int a);
    };
}
using namespace Punoljetna_osoba;

int getCijena(Osoba& a) {
    return a.starost;
}

void Osoba::setStarost(int a) {
    if (18 <= a && 100 >= a)
        starost = a;
    else cout << "niste punoljetni ili ste vec umrli";
}



int main() {
    Osoba a;
    a.setStarost(50);
    //cout << getCijena(a);
}
C++ 命名空间 friend

评论

0赞 Pete Becker 4/13/2023
代码定义了一个命名空间,然后立即用该指令将其吹走。确定命名空间是否对你重要,并适当地编写代码。如果你不想要它们,很好。不要使用它们。using

答:

1赞 Yksisarvinen 4/13/2023 #1

您需要转发声明 ,并且因为它需要引用 ,因此您还需要在以下之前转发声明该类:getCijenaOsoba

namespace Punoljetna_osoba {
    class Osoba; // forward declare Osoba class
}

// forward declare function
// note that it needs to refer to full name of the class since it's in different namespace
int getCijena(Punoljetna_osoba::Osoba& a); 

namespace Punoljetna_osoba {
    class Osoba {
        int starost;
    public:
        string ime, Prezime;
        friend int ::getCijena(Osoba& a);
        void setStarost(int a);
    };
}

// rest of the code

在线查看:https://godbolt.org/z/b7Kx1deh7

评论

0赞 Hrco69 4/13/2023
好的,这有效,我将阅读更多为什么它需要转发声明
0赞 Yksisarvinen 4/13/2023
@Hrco69 对于同一命名空间中的函数,声明可以用作正向声明,但对于任何其他情况,它都需要在类之前前向声明。不知道为什么会这样,但友谊并不是一个特别有用的机制,所以我从来不想真正检查它。friend