我刚收到一些代码示例,无法修改:
-i "sine=frequency=1000:duration=2"
我对行
感到困惑#include <iostream>
#include "Image.h"
#include "Ppm.h"
int main() {
Image* ob = 0x0;
try
{
ob = new Ppm("lena.ppm");
long kolor = countColors(*ob);
std::cout << "Unikalnych kolorow: " << kolor << '\n';
}
catch (ImageError& e)
{
std::cout << e.what() << std::endl;
}
delete ob;
return 0;
}
两个问题: 1)这个功能应该是静态的吗? 2)它应该是继承自第一个的Image类还是Ppm?
答案 0 :(得分:1)
我对行
感到困惑long kolor = countColors(* ob);
你说代码无法修改,所以代码中已经存在这一行,我假设代码正在编译/链接好吗?
如果编译正常,countColors()
的函数声明必须来自Image.h
或Ppm.h
,或来自头文件其中包括。它当然不是来自iostream
。
如果成功链接,则包含countColors()
函数定义的目标文件或库必须包含在链接步骤中。
我们只能猜测这个功能的签名;类似的东西:
long countColors(const Ppm& portablePixmap);
...或者......或者......
long countColors(const Image& image);
无论签名是什么,它都不会使用关键字static
(在类之外)声明,除非它仅在它实现的同一文件中使用。
1)这个功能应该是静态的吗?
简短的回答是:它不太可能被宣布为静态(请参阅下面的原因),但这可能不是您真正要求的。
我们知道countColors()
不是类方法或实例方法,因为如果是,您拥有< / strong>称之为 1 :
long kolor = SomeClass::countColors(*ob); // (class method)
或
long kolor = some_instance.countColors(*ob); // (instance method)
因此,如果它不是类或实例方法,那么它是静态的吗? 可能不是;这就是原因:
假设您已在文件foo.c中定义了一个函数foo
:
void foo(void) { ... }
...你可以从bar.c调用它:
#include "foo.h" // Tells compiler about foo()
void bar() { foo(); } // COMPILES AND LINKS OK
...但是如果您使用static
关键字在foo.c中定义了该函数:
static void foo(void) { ... }
...链接器将其视为foo.c的私有,因此除了foo.c之外,您无法从bar.c或任何其他源文件中调用它:
#include "foo.h" // Tells compiler about foo()
void bar() { foo(); } // COMPILE OK, BUT LINKER ERROR!
2)它应该是在Image类中,还是在Ppm中,它继承自第一个?
&#39;应该&#39;暗示您正在寻找适合放置此方法的地方,但您也声明此代码无法修改。
您是否尝试从自己的代码中调用此方法,并且您不确定要包含哪个头文件,或者如何调用它?
抱歉,如果我明白你想做什么,我可以给你一个更好的答案。
1 在{/ 1}}这样的C / C ++中,用宏做恶事是可能的,但是我们可以做到这一点忽视这种可能性。