Redian新闻
>
考考大家,其实也不只是C++,C#/Java也一样
avatar
考考大家,其实也不只是C++,C#/Java也一样# Programming - 葵花宝典
L*s
1
写个三页纸的文章,数学每次都有错。改了四次上来还是错了。
今天跟他说如果这次还有错,你就别投了。
恨不得说你就别来了。
avatar
b*i
2
class B {
protected:
B* next;
B* prev;
};
class D : public B {
public:
void foo() {
if (next && next->prev) // error: why?
return;
}
};
avatar
F*t
3
别转移话题。。
avatar
t*8
4
JAVA OK, C++ error
"protected" is different between C++ and JAVA

【在 b***i 的大作中提到】
: class B {
: protected:
: B* next;
: B* prev;
: };
: class D : public B {
: public:
: void foo() {
: if (next && next->prev) // error: why?
: return;

avatar
b*i
5
different package

【在 t**8 的大作中提到】
: JAVA OK, C++ error
: "protected" is different between C++ and JAVA

avatar
z*y
6
"next" is inherited, so no problem
but "next->prev" is not inherited
avatar
l*n
7
这种trick能反应什么?怪不得现在码工水平越来越走下坡路了

【在 b***i 的大作中提到】
: class B {
: protected:
: B* next;
: B* prev;
: };
: class D : public B {
: public:
: void foo() {
: if (next && next->prev) // error: why?
: return;

avatar
b*i
8
你居然觉得是trick,我猜你不知道错在哪里,也不知道怎么改。
这个其实是基本知识,但是大部分人都搞不定

【在 l**********n 的大作中提到】
: 这种trick能反应什么?怪不得现在码工水平越来越走下坡路了
avatar
i*p
9
in Java,
1. you need to check next!=null
2. if B and D in different packages, D's next (inherited), which is a
reference to a B's instance, cannot see the B's prev.
if you really need to access the member directly, change it to "public" or
add a public method to return the reference (preferred).

【在 b***i 的大作中提到】
: class B {
: protected:
: B* next;
: B* prev;
: };
: class D : public B {
: public:
: void foo() {
: if (next && next->prev) // error: why?
: return;

avatar
b*n
10
template
class B
{
friend D;
protected:
B *next;
B *prev;
};
class D: public B
{
public:
void foo()
{
if (next && next->prev)
return;
}
};
avatar
b*i
11
你说到电子上了,还有用Friend的那位,都不错。
下面是一个人的解法:既然是D的函数,那么一定是处理D的对象对不对?否则在D里面
处理B的那就多次一举了。
那么,(D*)next就是指向D的指针,就可以访问next了。我看这个就简单的破了原来的
限制。当然,如果next确实只是B,不一定是D就不行。不过大部分是这种情况。

【在 i**p 的大作中提到】
: in Java,
: 1. you need to check next!=null
: 2. if B and D in different packages, D's next (inherited), which is a
: reference to a B's instance, cannot see the B's prev.
: if you really need to access the member directly, change it to "public" or
: add a public method to return the reference (preferred).

avatar
k*n
12
晕。。你是说(B)next吧。。
这种情况。。。不是只要改B 的prev protected就行了吗。
cast没必要用时别用。
avatar
g*y
13
赞成少用cast!不知道next和prev会指向什么类型的,
就不要自作聪明。

【在 k**n 的大作中提到】
: 晕。。你是说(B)next吧。。
: 这种情况。。。不是只要改B 的prev protected就行了吗。
: cast没必要用时别用。

avatar
x*n
14
茴字真的有四种写法
avatar
b*i
15
本来就是Protected

【在 k**n 的大作中提到】
: 晕。。你是说(B)next吧。。
: 这种情况。。。不是只要改B 的prev protected就行了吗。
: cast没必要用时别用。

avatar
C*8
16
还有并发问题,check完null要访问的时候可能被重置了,因为是成员变量,不是局部
变量

【在 b***i 的大作中提到】
: class B {
: protected:
: B* next;
: B* prev;
: };
: class D : public B {
: public:
: void foo() {
: if (next && next->prev) // error: why?
: return;

avatar
n*n
17
报什么错?

【在 b***i 的大作中提到】
: class B {
: protected:
: B* next;
: B* prev;
: };
: class D : public B {
: public:
: void foo() {
: if (next && next->prev) // error: why?
: return;

avatar
p*o
18
仅仅从C++语法上来讲。
在D::foo() 里访问next 和 prev都没问题。但是通过 next->prev 就会编译错误。
((D*)next)->prev 才可以。C-style 类型转换优先级低于成员访问符号->。所以要加
额外的()在(D*)next 周围。
D从B那里继承了next, prev, 所以D可以自由访问next, prev. 但是这继承的next 是B
*类型的。next->prev 是在用B的指针访问B的protected成员变量,这个操作必须在B内
部里完成。
下面这段编译是没问题的。
class B {
protected:
B* next;
public:
B* prev;
};
class D : public B {
public:
void f() {
if (next->prev) {
cout << "hello" << endl;
}
}
};
avatar
f*z
19
累不累啊?!

【在 b***i 的大作中提到】
: class B {
: protected:
: B* next;
: B* prev;
: };
: class D : public B {
: public:
: void foo() {
: if (next && next->prev) // error: why?
: return;

avatar
F*1
20
这个解释比较清晰到位,赞一个!

是B

【在 p******o 的大作中提到】
: 仅仅从C++语法上来讲。
: 在D::foo() 里访问next 和 prev都没问题。但是通过 next->prev 就会编译错误。
: ((D*)next)->prev 才可以。C-style 类型转换优先级低于成员访问符号->。所以要加
: 额外的()在(D*)next 周围。
: D从B那里继承了next, prev, 所以D可以自由访问next, prev. 但是这继承的next 是B
: *类型的。next->prev 是在用B的指针访问B的protected成员变量,这个操作必须在B内
: 部里完成。
: 下面这段编译是没问题的。
: class B {
: protected:

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。