小编Ste*_*vić的帖子

类名可以用作命名空间吗?

我记得有人告诉我 C++ 类有自己的命名空间,并且类名可以用作范围解析的命名空间,如下所示:

// Example.h
class Example {
    void Private();
public:
    void Public();
}
Run Code Online (Sandbox Code Playgroud)

并且,稍后以类似于此的方式:

// Example.cpp
#include "Example.h"
using /*namespace*/ Example;
void Private() {}
void Public() {}
Run Code Online (Sandbox Code Playgroud)

代替:

// Example.cpp
#include "Example.h"
void Example::Private() {}
void Example::Public() {}
Run Code Online (Sandbox Code Playgroud)

但我在我的书中既找不到解释也找不到例子。一个简短的谷歌搜索也是一个死胡同。这是真的吗?

c++ scope namespaces class header-files

7
推荐指数
1
解决办法
5812
查看次数

私有嵌套类的范围分辨率更短

我有这个(简化)情况:

class Tree {
    class Iterator {
        class Stack {
            // ...
        }
    public:
        // ...
    }
public:
    //...
}
Run Code Online (Sandbox Code Playgroud)

我不想弄乱类的定义,我决定只在类本身内编写方法声明.稍后(下面是waaay)我想要定义,比如复制赋值运算符,如下所示:

Tree::Iterator::Stack& Tree::Iterator::Stack::operator = (const Stack& p_stack) {
// ...
}
Run Code Online (Sandbox Code Playgroud)

我必须处理这些令人讨厌的范围决议.我想知道,如果有一种方法,以缩短他们,因为usingtypedef,因为我知道他们,不提供我任何东西.

编辑:由于这不是CodeReview,@ Yulian要求澄清,这里是简短的版本:

我正在进行迭代的Red-Black Tree实现.提到的class Iterator是后期遍历(因此它是特定于订单后的顺序),并且class Stack是它的实用程序类.在这个简短的程序中,只class Tree使用Iterator,而且只Iterator使用Stack.

在@Yulian的提醒之后,我回想一下,如果提到的类被单独定义(甚至可能作为模板),它会更加面向对象,但这是一个小的,自包含的程序,我试图保持这种方式.

编辑:自包含也意味着它是一个独立的单文件程序,所以没有.h文件或外部代码重新使用.为什么?因为ACADEMIA(和相关的任意限制).

c++ scope nested-class

6
推荐指数
1
解决办法
160
查看次数

链接器错误:_main 已在 *.obj 中定义

以下代码结构:

数组堆栈.h

#ifndef ARRAY_STACK_H
#define ARRAY_STACK_H
#include "Array.h"
// class ArrayStack
#endif
Run Code Online (Sandbox Code Playgroud)

ArrayStack.cpp

#include "ArrayStack.h"
// ArrayStack's methods
Run Code Online (Sandbox Code Playgroud)

数组.h

#ifndef ARRAY_HEADER
#define ARRAY_HEADER
#include <iostream>
// class Array
#endif
Run Code Online (Sandbox Code Playgroud)

数组.cpp

#include "Array.h"
// Array's methods
Run Code Online (Sandbox Code Playgroud)

主程序

#include "ArrayStack.h"
int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生这些错误:

LNK1169 找到一个或多个多重定义的符号

LNK2005 _main 已在 Array.obj 中定义

这里有什么问题?请注意,当它第一次被包含在项目中时,它本身Array.cpp确实有int main()定义,但不再有它(也没有ArrayStack.cpp)。此外,当省略int main()in时,代码编译得很好main.cpp......

c++ linker-errors visual-studio

5
推荐指数
1
解决办法
9428
查看次数

围绕表达式的括号和括号基本上都做同样的事情吗?

简而言之,这两个for循环的功能是否相同:

for (int i = 0; i < (p_size < size ? p_size : size); i++);
for (int i = 0; i < {p_size < size ? p_size : size}; i++);
Run Code Online (Sandbox Code Playgroud)

循环在方法(成员函数)内,p_size是它的参数,size是一个属性(成员变量).Microsoft Visual Studio 2015编译这两个代码,但p_size不会像使用大括号的代码中的其他参数(在编辑器中)那样着色.

c++ brackets curly-brackets visual-studio-2015

4
推荐指数
1
解决办法
98
查看次数

我可以从内部类访问"secondary this"吗?

我有基础课

abstract class Unit {
    Unit target;
    abstract class UnitAI {/*...*/}
}
Run Code Online (Sandbox Code Playgroud)

从这些,我得出了

class Infantry extends Unit {
    class InfantryAI extends UnitAI {/*...*/}
}
Run Code Online (Sandbox Code Playgroud)

类可以以InfantryAI某种方式获得用于访问其周围类的成员的辅助(隐式)吗?thisInfantry

具体来说,它需要确定其周围的类Infantry是否被其目标所针对,如下所示:

if (/*secondary_this.*/target.target == secondary_this)
Run Code Online (Sandbox Code Playgroud)

或者,通常是另一个人Unit.

java nested derived-class inner-classes

3
推荐指数
1
解决办法
67
查看次数