我昨天遇到了一个错误,虽然它很容易解决,但我想确保我正确理解C++.
我有一个受保护成员的基类:
class Base
{
protected:
int b;
public:
void DoSomething(const Base& that)
{
b+=that.b;
}
};
Run Code Online (Sandbox Code Playgroud)
这编译并且工作得很好.现在我扩展Base但仍想使用b:
class Derived : public Base
{
protected:
int d;
public:
void DoSomething(const Base& that)
{
b+=that.b;
d=0;
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下DoSomething仍然参考a Base,而不是Derived.我希望我仍然可以访问that.b内部Derived,但我得到一个cannot access protected member错误(MSVC 8.0 - 还没有尝试过gcc).
显然,添加一个公共getter b解决了这个问题,但我想知道为什么我无法直接访问b.我认为,当您使用公共继承时,受保护的变量对派生类仍然可见.
我正在寻找一种在编译时构建字符串数组的简单方法.对于测试,我将一个名为Strings具有以下成员的类放在一起:
Strings();
Strings(const Strings& that);
Strings(const char* s1);
Strings& operator=(const char* s1);
Strings& operator,(const char* s2);
Run Code Online (Sandbox Code Playgroud)
使用这个,我可以成功编译这样的代码:
Strings s;
s="Hello","World!";
Run Code Online (Sandbox Code Playgroud)
该s="Hello"部分调用operator=返回a Strings&然后调用的operator,get "World!".
我无法工作(在MSVC中,尚未尝试任何其他编译器)是
Strings s="Hello","World!";
Run Code Online (Sandbox Code Playgroud)
我假设这里Strings s="Hello"会调用复制构造函数,然后一切都会像第一个例子一样.但我得到错误:error C2059: syntax error : 'string'
但是,这很好用:
Strings s="Hello";
Run Code Online (Sandbox Code Playgroud)
所以我知道复制构造函数至少可以用于一个字符串.有任何想法吗?我真的很想让第二种方法工作,只是为了使代码更清洁.
我在使用Linux编译代码时遇到了一些麻烦,但它在Windows中完美运行.
Windows编译器:Visual Studio 2005
Linux编译器:gcc版本3.4.3 20041212(Red Hat 3.4.3-9.EL4)
class DoSomething
{
public:
template <class DataType>
bool Execute()
{
//do something here
}
};
template <class Operator>
TypeSwitch(int DataTypeCode, Operator& Op)
{
switch (DataTypeCode)
{
case 1: return Op.Execute<char>();
case 2: return Op.Execute<int>();
//snip;
}
}
//To call the operator
TypeSwitch(Code,DoSomething);
Run Code Online (Sandbox Code Playgroud)
在Windows中,这段代码完美无缺,完全符合我的要求.在Linux中,我得到错误:
错误:在'>'标记之前预期的primary-expression
错误:')'令牌之前的预期primary-expression
对于带有case语句的每一行.
有任何想法吗?
谢谢,迈克
我有一个我认为相对容易的项目,但结果却变成了我所希望的更多痛苦.首先,我正在与之交互的大部分代码都是我无法控制的遗留代码,所以我不能做大范例更改.
这是我需要做的简化说明:假设我有大量从stdin读取并写入stdout的简单程序.(这些我无法触及).基本上,输入到stdin是一个命令,如"将温度设置为100"或类似的命令.输出是"温度已设置为100"或"温度已降至设定点以下"的事件.
我想做的是编写一个应用程序,可以启动一堆这些简单的程序,监视事件,然后根据需要向它们发送命令.我最初的计划是像popen这样的东西,但我需要一个双向的popen来获取读写管道.我一起攻击了一些我称之为popen2的东西,我将命令传递给它,两个FILE*充满了读写流.然后,我需要做的就是编写一个简单的循环,从每个进程的每个stdouts读取,执行它需要的逻辑,然后将命令写回正确的进程.
这是一些伪代码
FILE *p1read, *p1write;
FILE *p2read, *p2write;
FILE *p3read, *p3write;
//start each command, attach to stdin and stdout
popen2("process1",&p1read,&p1write);
popen2("process2",&p2read,&p2write);
popen2("process3",&p3read,&p3write);
while (1)
{
//read status from each process
char status1[1024];
char status2[1024];
char status3[1024];
fread(status1,1024,p1read);
fread(status2,1024,p2read);
fread(status3,1024,p3read);
char command1[1024];
char command2[1024];
char command3[1024];
//do some logic here
//write command back to each process
fwrite(command1,p1write);
fwrite(command2,p2write);
fwrite(command3,p3write);
}
Run Code Online (Sandbox Code Playgroud)
实际程序更复杂,它在流中查看是否有任何内容正在等待,如果没有,它将跳过该过程,同样如果它不需要将命令发送到某个进程则不会.但是这段代码给出了基本的想法.
现在这在我的UNIX机器上运行得很好,甚至在带有cygwin的Windows XP机箱上也很不错.但是,现在我需要让它在本机上运行Win32.
困难的部分是我的popen2使用fork()和execl()来启动进程并将流分配给子进程的stdin和stdout.有没有一种干净的方式我可以在Windows中做到这一点?基本上,我想在windows中创建一个与我的unix版本相同的popen2.这样,唯一的Windows特定代码将在该函数中,并且我可以以相同的方式处理其他所有工作.
有任何想法吗?
谢谢!
我很快就会遇到一个有趣的问题,我已经开始考虑算法。我想得越多,我就越害怕,因为我认为它会扩展得非常可怕 (O(n^4)),除非我变得聪明。我很难在这件事上变得聪明。这是问题的简化描述。
我有 N 个多边形(其中 N 可以是巨大的 >10,000,000),它们存储为 M 个顶点的列表(其中 M 的数量级为 100)。我需要做的是为每个多边形创建一个在其他多边形之间共享的任何顶点的列表(将多边形视为感兴趣的周围区域,有时是区域但彼此相对)。我看到这样的东西
Polygon i | Vertex | Polygon j | Vertex
1 1 2 2
1 2 2 3
1 5 3 1
1 6 3 2
1 7 3 3
Run Code Online (Sandbox Code Playgroud)
这意味着多边形 1 中的顶点 1 与多边形 2 中的顶点 2 相同,多边形 1 中的顶点 2 与多边形 2 中的顶点 3 相同。同样,多边形 1 中的顶点 5 与多边形中的顶点 1 相同3....
为简单起见,我们可以假设多边形从不重叠,它们最接近的是在边缘处接触,并且所有顶点都是整数(以使相等性易于测试)。
我现在唯一能做的就是对于每个多边形,我必须遍历所有多边形和顶点,给我一个 O(N^2*M^2) 的缩放比例,这在我的情况下会非常糟糕。我可以拥有非常大的多边形文件,因此我什至无法将其全部存储在 RAM 中,因此这意味着要多次读取该文件。
到目前为止,这是我的伪代码
for i=1 to N
Pi=Polygon(i)
for j = …Run Code Online (Sandbox Code Playgroud) 我正在写一些让我疯狂的中间件.我正在寻找一些I18N专家来帮助我 - 这对我来说都是新手.
现在这一切都在Windows中,但它也必须在Linux和Mac上运行,不过我敢打赌这些都很容易.
我有一个系统(我无法触摸)会给我一个字符串,就像一个wchar_t*.它接受UTF-8或当前语言环境中的输入,并为魔法提供wchar_t*.
我有另一个我正在使用的API,它只能将文件名作为char*(我也无法触摸).
所以我一直在做的是在wchar_t*中使用我的文件名并使用Windows API函数WideCharToMultiByte并将其转换为char*并将其传递给我的其他API函数.在QA决定使用日语操作系统之前,它工作正常.现在,fopen(我无法触及的API内部)失败了.
我已经尝试在我的WideCharToMultiByte调用中同时使用CP_ACP和CP_UTF8,并且在我的开发(美国 - 英语)机器上工作,即使文件名中包含日文字符.但两者都失败了日本的操作系统.
关于我应该如何处理这些文件名的任何提示?