该功能应该是静态的吗?

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.hPpm.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 ++中的宏做恶事,但我们会忽略这种可能性。

以上是关于该功能应该是静态的吗?的主要内容,如果未能解决你的问题,请参考以下文章

*可以*为静态的C#方法应该是静态的吗? [关闭]

“静态”模式不应该总是静态的吗?

评估一个静态私有变量(Java),不应该是非法的吗? [复制]

错误:这个片段内部类应该是静态的 [ValidFragment]

片段内部静态类和gradle问题

这对嵌套类来说是个好情况吗?如果是这样,它应该是静态的吗? [复制]