我记得有人告诉我 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)
但我在我的书中既找不到解释也找不到例子。一个简短的谷歌搜索也是一个死胡同。这是真的吗?
我有这个(简化)情况:
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)
我必须处理这些令人讨厌的范围决议.我想知道,如果有一种方法,以缩短他们,因为using和typedef,因为我知道他们,不提供我任何东西.
编辑:由于这不是CodeReview,@ Yulian要求澄清,这里是简短的版本:
我正在进行迭代的Red-Black Tree实现.提到的class Iterator是后期遍历(因此它是特定于订单后的顺序),并且class Stack是它的实用程序类.在这个简短的程序中,只class Tree使用Iterator,而且只Iterator使用Stack.
在@Yulian的提醒之后,我回想一下,如果提到的类被单独定义(甚至可能作为模板),它会更加面向对象,但这是一个小的,自包含的程序,我试图保持这种方式.
编辑:自包含也意味着它是一个独立的单文件程序,所以没有.h文件或外部代码重新使用.为什么?因为ACADEMIA(和相关的任意限制).
以下代码结构:
#ifndef ARRAY_STACK_H
#define ARRAY_STACK_H
#include "Array.h"
// class ArrayStack
#endif
Run Code Online (Sandbox Code Playgroud)
#include "ArrayStack.h"
// ArrayStack's methods
Run Code Online (Sandbox Code Playgroud)
#ifndef ARRAY_HEADER
#define ARRAY_HEADER
#include <iostream>
// class Array
#endif
Run Code Online (Sandbox Code Playgroud)
#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......
简而言之,这两个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不会像使用大括号的代码中的其他参数(在编辑器中)那样着色.
我有基础课
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.
c++ ×4
scope ×2
brackets ×1
class ×1
header-files ×1
java ×1
namespaces ×1
nested ×1
nested-class ×1