该功能应该是静态的吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了该功能应该是静态的吗?相关的知识,希望对你有一定的参考价值。
我刚收到一些代码示例,无法修改:
#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 << '
';
}
catch (ImageError& e)
{
std::cout << e.what() << std::endl;
}
delete ob;
return 0;
}
我很困惑
long kolor = countColors(*ob);
两个问题:1)这个功能应该是静态的吗? 2)它应该是继承自第一个的Image类还是Ppm类?
我很困惑
long kolor = countColors(* ob);
你说代码不能被修改,所以代码中已经存在这一行,我假设代码正在编译/链接好吗?
如果它编译好,countColors()
的函数声明必须从Image.h
或Ppm.h
中包含,或者从其中一个包含的头文件中包含。它当然不是来自iostream
。
如果它成功链接,则包含countColors()
函数定义的目标文件或库必须包含在链接步骤中。
我们只能猜测这个功能的签名;就像是:
long countColors(const Ppm& portablePixmap);
...或者可能...
long countColors(const Image& image);
无论签名是什么,它都不会使用关键字static
(在类之外)声明,除非它仅在它实现的同一文件中使用。
1)这个功能应该是静态的吗?
简短的回答是:它不太可能被声明为静态(请参阅下面的原因),但这可能不是你真正要求的。
我们知道countColors()
不是类方法或实例方法,因为如果是,你必须像这样调用它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类?
'should'意味着您正在寻找合适的位置来放置此方法,但您还声明此代码无法修改。
您是否尝试从自己的代码中调用此方法,并且您不确定要包含哪个头文件,或者如何调用它?
对不起,如果我明白你想做什么,我可以给你一个更好的答案。
1像Cazxswpoi这样可以用C / C ++中的宏做恶事,但我们会忽略这种可能性。
以上是关于该功能应该是静态的吗?的主要内容,如果未能解决你的问题,请参考以下文章
评估一个静态私有变量(Java),不应该是非法的吗? [复制]