从参考中公开原始类

时间:2015-06-20 16:52:06

标签: c++ class casting reference

my iterator *运算符返回对class:File

的引用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/infoview_title" android:textSize="@dimen/textSizeBig"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/infoview_body"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/infoview_link" android:clickable="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/md_orange_700"/>

</LinearLayout>

我创建了另一个类:

   File& FilesIterator::operator*() {
         return *m_pFile;
   }

在代码的另一部分中,我需要公开类TextFile的公共函数 在我使用*运算符之后。

我该怎么做?

由于

1 个答案:

答案 0 :(得分:0)

  

&#34;我该怎么做?&#34;

您的代码已经公开了引用,您可能只需要在File中将{em> function 声明为virtual或纯virtual功能:

class File {
public:
    virtual void foo() = 0;
};

class TextFile : public File {
public:
    virtual void foo() {
        // Provide an implementation for foo()
    }
};

关于comments的澄清:

  

&#34;我也有class Directory : public File&#34;

另一种方法是为virtualFileDirectory提供TextFile析构函数,并使用dynamic_cast<TextFile&>(*it);

 class File {
 public:
     virtual ~File() {}
 };

 class TextFile : public File {
 public:
     virtual ~TextFile() {}
 };

 class Directory : public File {
 public:
     virtual ~File() {}
 };
 int main() {
     Directory d("/my/directory/path");
     FilesIterator it = d.begin();
     while(it != d.end()) {
         File* f = &(*it);
         Directory* directoryEntry = 
             dynamic_cast<Directory*>(f);
         TextFile* textFileEntry = 
             dynamic_cast<Directory*>(f);
         if(directoryEntry ) {
             // Proceed with Directory specific code
         }
         else if(textFileEnty) {
             // Proceed with TextFile specific code
         }
         else {
             // Whatever ???
         }

         ++it; // Process next entry
     }
 }