我有一个带有几个迭代器的容器类作为嵌套类.结构是这样的:
class Grid
{
protected:
class Iterator
{
Iterator(Grid* g) : grid(g){}
Grid* grid;
}
class MoreIterator : public Iterator
{
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想将迭代器移动到自己的头文件中,以清理容器代码.
class Grid
{
protected:
#include "griditerators.h"
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这编译没有错误.但:
在QtCreator中排队
Iterator(Grid* g) : grid(g){}
Grid* grid;
Run Code Online (Sandbox Code Playgroud)
被标记为错误,告诉我"网格不是类型名称".
我以为我可以通过griditerator.h文件中的前向声明来解决这个问题:
class Grid;
class Iterator
{
Iterator(Grid* g) : grid(g){}
Grid* grid;
}
Run Code Online (Sandbox Code Playgroud)
但这给了我一个编译错误:类Grid与声明它的类具有相同的名称.
用#include"grid.h"替换前向声明.但我不知何故认为这很难看.
所以我有两个工作选择.一个显示我的IDE中的丑陋错误,另一个我不喜欢那么多.
我尝试了其他变体,其中include不在封闭类中,但由于不同的原因而无法编译.
所以我的问题是:是否有任何"最佳实践"或包含模式来处理太大而无法将它们保存在封闭类文件中的嵌套类?
例如,有没有办法声明一个嵌套类,如:
class Grid::Iterator
Run Code Online (Sandbox Code Playgroud) 因此,对于我正在处理的程序,我正在尝试创建一个解析文本文件的方法.使用文本文件中的值,创建一个ArrayList内ArrayList.到目前为止,这是我的代码:
public ArrayList<ArrayList<String>> getRels(String relsFile)
{
String[] currentId;
int i = -1;
ArrayList<ArrayList<String>> relsList = new ArrayList<ArrayList<String>>();
relsList.add(new ArrayList<String>());
try
{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream(relsFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null)
{
// Add values to array list
currentId = strLine.split(",");
relsList.get(++i).add(currentId[0]);
//???????????
}
//Close the input stream
in.close();
}
catch (Exception e)
{
System.err.println("Error: …Run Code Online (Sandbox Code Playgroud) 我在cakephp中有一个项目,当我打电话给供应商使用AES解密字符串时,我得到错误:
Fatal error: Class declarations may not be nested in /var/www/html/myproject/cake/libs/log/file_log.php on line 30
Run Code Online (Sandbox Code Playgroud)
这是我的控制器中的代码:
App::import('vendor', 'aes', array('file' => 'AES/AES.php'));
$aes = new AesCtr();
$decrypted = $aes->decrypt($encrypted, "mykey", 128);
Run Code Online (Sandbox Code Playgroud)
这是供应商的一部分(一个名为AES.php的文件):
class Aes {
//....Methods
}
class AesCtr extends Aes {
public static function decrypt($ciphertext, $password, $nBits) {
//....Method Logic
}
//....Other methods
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这里给出的解释:PHP嵌套类工作......有点? 但我没有太多的PHP经验,也无法通过他们展示的"hacky方式"来解决这个问题.
任何帮助表示赞赏.如果需要更多信息,请告诉我.
UPDATE类Aes和AesCtr(两者都在文件AES.php中).
<?php
/* - - - - - - - - - - - - - - - - - - - - …Run Code Online (Sandbox Code Playgroud) 我要声明的Iter是typename,但没有typedef.
然后,我不能Iter在我的template class声明中使用=>令人沮丧:(请教
我如何使用Iter,或者解释我为什么C++如此讨厌 ......
template <typename T>
struct MyContainer
{
typedef std::vector<T> Vec;
typename Vec::iterator Iter;
void Fo (typename std::vector<T>::iterator); //ok
typename std::vector<T>::iterator Ba(); //ok
void Foo (Iter); //error: 'Iter' is not a type
Iter Bar (); //error: 'Iter' does not name a type
}; //(gcc 4.1.2)
Run Code Online (Sandbox Code Playgroud)
typedef不能用来申报Iter?为什么不?Iter内template class?(例如作为函数参数类型)编辑
在指令中typename Vec::iterator Iter;,关键字typename表示 …
我刚刚找到一个Java示例,它使用类型为当前类本身的变量.我无法理解为什么以及何时使用这样的东西!这本书的作者没有解释它,因为它只是关于其他东西的一个例子的代码的一部分!谁能帮助我理解这种方法的实用性?它与"单身设计模式"有关吗?此外,我也试图实例化test1,test2但我得到一个错误!
public class Test {
public Test() {
Test test1;
Test test2;
}
}
Run Code Online (Sandbox Code Playgroud)
原始代码段是关于嵌套类的:
public class Tree {
ExampleNode master;
public Tree() {
}
//...
class ExampleNode {
ExampleNode rightNode;
ExampleNode leftNode;
//...
void printMaster() {
System.out.println( master );
}
}
}
Run Code Online (Sandbox Code Playgroud) 这是一个奇怪的问题,但我使用嵌套类在c ++中创建类似属性的功能.我还通过使嵌套类的赋值运算符受到保护以及嵌套类的主机类a使这些工作成为ReadOnly Friend.不幸的是,似乎任何继承类(with : public BaseClass)仍然无法访问嵌套类的赋值运算符.
我不知道它是否重要,但我确实把它放在Friend了课堂的公共部分.
有谁知道如何解决这个问题?(或者破解它)谢谢
编辑:添加了代码示例
#define ReadOnlyProperty(type,name,parent) \
protected: \
class name : public PropertyBase<type> \
{ \
parent* This; \
public: \
friend class parent; \
name(parent* instance) { This = instance; } \
protected: \
void operator=(type value) {Set(value);} \
void Set(type value); \
type Get() const; \
}; \
public: name name; \
friend class name; \
private:
Run Code Online (Sandbox Code Playgroud)
基类:
class Object
{
ReadOnlyProperty(char,Type,Object);
public:
Object() : Type(this) {}
}; …Run Code Online (Sandbox Code Playgroud) 编译器如何知道嵌套类型,如:
.....等等
需要清晰.......

困扰我的是第二点.
我认为这可能与"this"指针不是静态的事实有关,因此内部类无法访问它.我不确定这是否是正确的解释.
这也为我提出了另一个问题,即"这个"指针定义在哪里?
我们的验证环境的代码指南是每个文件一个类.
有时a uvm_object只需要另外1个uvm_component,因此,遵循面向对象的理论,我们应该使用嵌套/内部类.
SystemVerilog完全支持嵌套类.但是,他们是否受到UVM的支持?
是否可以编译如下所示的内容:
class inception_level_1 extends uvm_test;
`uvm_component_utils(inception_level_1)
function new(string name = "inception_level_1", uvm_component parent = null);
super.new(name, parent);
endfunction
class inception_level_2 extends uvm_object;
int a;
`uvm_object_utils_begin(inception_level_2)
`uvm_field_int(a, UVM_DEFAULT)
`uvm_object_utils_end
function new(string name = "inception_level_2");
super.new(name);
endfunction
endclass
endclass
Run Code Online (Sandbox Code Playgroud)
目前上面的代码给出了编译错误:
** Error: testbench.sv(20): (vlog-2889) Illegal to access non-static method 'uvm_report_warning' outside its class scope.
Run Code Online (Sandbox Code Playgroud)
完整的代码示例:http://www.edaplayground.com/x/3r8
所以我的代码有点像这样
class foo1
{
public:
foo1()
{
a = "text";
}
void getString()
{
return a;
}
private:
string a;
};
class foo2
{
public:
foo2()
{
foo3 boo3;
}
class foo3
{
public:
foo3()
{
foo1 boo1;
}
private:
foo1 boo1;
};
private:
};
int main()
{
foo2 object;
cout << /* ??? */ ;
}
Run Code Online (Sandbox Code Playgroud)
首先,类中的代码结构是否存在任何问题,其次,我应该在注释的位置放置在int main()中初始化的foo2对象中显示字符串a?
nested-class ×10
c++ ×4
java ×4
class ×2
aes ×1
arraylist ×1
c++11 ×1
cakephp ×1
inheritance ×1
jvm ×1
linked-list ×1
nested ×1
object ×1
php ×1
templates ×1
text-files ×1
typedef ×1
typename ×1
uvm ×1