该功能应该是静态的吗?

时间:2017-12-28 18:04:19

标签: c++ image inheritance static

我刚收到一些代码示例,无法修改:

-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?

1 个答案:

答案 0 :(得分:1)

  

我对行

感到困惑      

long kolor = countColors(* ob);

你说代码无法修改,所以代码中已经存在这一行,我假设代码正在编译/链接好吗?

如果编译正常,countColors()的函数声明必须来自Image.hPpm.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 ++中,用宏做恶事是可能的,但是我们可以做到这一点忽视这种可能性。