- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 C++ 中,我使用多态类和友元来创建一个基本的“ friend 组”。但是,当我尝试访问类人(男孩类的 friend )的私有(private)年龄函数时,我无法访问它。有什么问题吗?
/* Polymorphic Classes and Class Friendship */
#include <iostream>
class Person{
public:
Person(char* name, int age) : Name(name), Age(age){}
char* Name;
virtual void Speak(void){
std::cout << "I am a person called " << Name << std::endl;
}
virtual ~Person(void){delete this;}
private:
int Age;
};
class Boy : public Person{
friend class Person;
public:
Boy(char* name, int age, Person* Friend) : Person(name, age), MyFriend(Friend){}
void Speak(void){
std::cout << "I am a boy called " << Name << ". My friend " << MyFriend->Name << "'s age is " << MyFriend->Age /* Error here */ << std::endl;
}
~Boy(void){delete this;}
private:
Person* MyFriend;
};
int main(void){
Person* John = new Person("John", 12);
Boy* James = new Boy("James", 14, John);
Boy* Keith = new Boy("Keith", 18, James);
John->Speak();
James->Speak();
John->~Person();
James->~Boy();
Keith->~Boy();
return (0);
}
最佳答案
C++ 友元是单向的。
尝试使用protected
来授予对派生类的访问权限。
/* Polymorphic Classes and Class Friendship */
在 C++ 中避免使用 C /*
…*/
多行注释是个好主意,因为它们不嵌套,并且有些/许多程序员使用它们来注释掉代码以进行调试。
优先使用 C++ //
(单)行注释。
#include <iostream>
好的。
class Person{
public:
好的。
Person(char* name, int age) : Name(name), Age(age){}
第一个参数应该是char const*
。例如,如果没有 const
,在使用符合 C++11 的编译器时,您将无法传递文字字符串。
char* Name;
这里的原始指针需要与构造函数的形式参数匹配。
实际上,它被初始化为构造函数指针参数的简单拷贝,它将任何 Person
实例的生命周期限制为实际参数的生命周期。
std::string
是一个更加灵活且不会出现问题的选择。
virtual void Speak(void){
std::cout << "I am a person called " << Name << std::endl;
}
由于此函数不是 const
,因此无法在 const
对象上调用它。
此外,void
是 C 主义,在 C++ 中不好。
在 C 语言中,它表示该函数不带任何参数。在 C++ 中这是不必要的,即 void
是不必要的废话。此外,C 甚至没有成员函数。
virtual ~Person(void){delete this;}
再说一遍,void
是不好的。
在这种情况下,删除这个
是非常不好的。
private:
int Age;
唯一的问题是未能对数据成员应用某些命名约定。例如,像 age_
(请注意,下划线位于末尾),或者像 my_age
或 myAge
.
};
好的。
class Boy : public Person{
好的。
friend class Person;
毫无意义,因为 Person
类无法访问此类中的任何内容。
public:
Boy(char* name, int age, Person* Friend) : Person(name, age), MyFriend(Friend){}
同样,应该是char const*
。或者std::string const&
。
void Speak(void){
std::cout << "I am a boy called " << Name << ". My friend " << MyFriend->Name << "'s age is " << MyFriend->Age /* Error here */ << std::endl;
}
在这里,如果编译器支持它,请添加一个覆盖
,以便编译器检查您是否确实覆盖了基类函数,例如void Speak() override {
.
换句话说,抛弃void
,这是不必要的C主义措辞,但要添加override
,这是非常有用的。
~Boy(void){delete this;}
void
不好。
在这种情况下,删除这个
是非常不好的。
private:
Person* MyFriend;
与之前一样,这再次限制了 Boy
实例的生命周期。
};
好的。
int main(void){
void
不好。
Person* John = new Person("John", 12);
Boy* James = new Boy("James", 14, John);
Boy* Keith = new Boy("Keith", 18, James);
John->Speak();
James->Speak();
John->~Person();
到目前为止还好。
James->~Boy();
Keith->~Boy();
永远不要显式调用析构函数。好吧,一个真正经验丰富的程序员可能会在使用放置 new
进行分配时这样做:它在语言中是有原因的。但作为初学者,即使拥有一两年的专业经验,也不要这样做。
return (0);
技术上可以,但没有必要。 main
默认返回 0。
}
关于C++ 友元/多态类错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20772930/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!