Bir örnekleme standart Template Library (STL) sınıf ve veri üyesi bir STL nesnesi içeren bir sınıf verme

Makale çevirileri Makale çevirileri
Makale numarası: 168958 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bu makalede, aşağıdaki görevlerin nasıl gerçekleştirileceği anlatılmaktadır:
  • Standart bir şablon Kitaplığı'nın bir örnekleme verme (STL) sınıf.
  • Bir STL olan veri üye olarak içeren sınıf verme nesne.
Not Genelleştirilmiş şablon bilgisayarınıza vermemeniz. Şablon örneği; diğer bir deyişle, tüm şablon parametreleri sağlanmalı ve örnekleme adresindeki noktasına, tam tanımlı türü olmalıdır. Örnek "yığını <int>;" STL yığın sınıfı oluşturur. Örneği başlatıldığında oluşturulacak tüm üyeleri sınıf yığın <int>zorlar.

Ayrıca, bazı STL kapsayıcıları (eşleme, set, sıra, liste, deque) verilemiyor unutmayın. Lütfen ayrıntılı bir açıklama için izlemek için daha fazla bilgi bölümüne bakın.

Daha fazla bilgi

Visual C++ 5.0 ile başlayarak, bir <a0>şablon</a0> sınıfının bir örneği başlatıldığında zorlamak ve örnekleme vermek olanaklıdır. Bir şablon sınıf örneği başlatıldığında vermek için aşağıdaki sözdizimini kullanın:

Bir STL sınıfı aktarmak için

  1. Aynı DLL ile hem DLL ve exe dosyası, bağlantı C çalışma zamanı sürümü. Msvcrt.lib (sürüm oluşturma) her ikisi de bir bağlantı veya Msvcrtd.lib (hata ayıklama yapı) her ikisi de bağlayabilirsiniz.
  2. DLL'DE, DLL dosyasından STL sınıfı örnekleme vermek için şablon örneği başlatıldığında bildirimindeki __declspec belirtici sağlar.
  3. .Exe dosyasına sınıfı DLL dosyasından almak için dış ve __declspec belirleyicilerine şablon örneği başlatıldığında bildirimindeki sağlar. Bu bir uyarı C4231 olur "kullanılan bir standart olmayan uzantılı: 'extern' açık şablon örneği başlatıldığında önce." Bu uyarıyı yoksayabilirsiniz.

Nesne STL mı veri bir üye olarak içeren sınıf ver

  1. Aynı DLL ile hem DLL ve exe dosyası, bağlantı C çalışma zamanı sürümü. Msvcrt.lib (sürüm oluşturma) her ikisi de bir bağlantı veya Msvcrtd.lib (hata ayıklama yapı) her ikisi de bağlayabilirsiniz.
  2. DLL'DE, DLL dosyasından STL sınıfı örnekleme vermek için şablon örneği başlatıldığında bildirimindeki __declspec belirtici sağlar.

    Not: Adım 2 atlayamazsınız. Örnekleme veri üyesini oluşturmak için kullandığınız STL sınıfının vermeniz gerekir.
  3. DLL'DE, sınıf DLL dosyasından vermek için bu sınıf bildirimindeki __declspec belirtici sağlar.
  4. .Exe dosyasına sınıfı DLL dosyasından almak için sınıf bildirimindeki __declspec belirtici sağlar.

    Verdiğiniz sınıfı, bir veya birden çok temel sınıfları vardır ve temel sınıfları olarak vermeniz gerekir. Vermekte olduğunuz sınıfı sınıfındandır veri üyeleri içeriyorsa, veri üyeleri de sınıflarını vermeniz gerekir.
Not: Bazı STL sınıfları, diğer STL sınıflarını kullanın. Bu sınıflar de verilmesi gerekir. 1; Bu durumda daha düşük bir uyarı düzeyi, /W2, /W3 veya /W4'i derleme aktarılması gerekir sınıflar derleyici uyarısı listelenir. Uyarı düzeyi 4, çok sayıda uyarı iletilerini STL üstbilgilerinin oluşturur ve şu anda, bu nedenle önerilmez.

Bazı STL sınıflar, iç içe geçmiş sınıflarını içerir. Bu sınıflar verilebilir değil. Örneğin, bir iç içe geçmiş sınıfı deque::iterator deque içerir. Deque verirseniz, deque::iterator vermelisiniz bir uyarı alırsınız. Deque::iterator verirseniz, deque vermelisiniz bir uyarı alıyorum. Bu şablon bir sınıf örneği sonra onu re-instantiated dışa ve değil, tasarlanmış bir sınırlama tarafından kaynaklanır. Şu anda verilebilir STL kapsayıcıyı vektör ' dir. Diğer kapsayıcıları (diğer bir deyişle, eşleme, ayarlama, sıra, liste, deque) tüm iç içe geçmiş sınıfları içeren ve verilemez.

Bir kullanıcı tarafından tanımlanan türle (UDT) parametreli bir STL kapsayıcısında verdiğinizde, işleçler tanımlamalısınız < ve sizin UDT için ==. <myclass>Örneğin, vektör < Sınıfım > verirseniz, MyClass::operator tanımlamalısınız < ve Sınıfım işletmen ==. Bunun nedeni, tüm STL kapsayıcısı sınıfları işleçlerin varlığını gerektiren bir üye karşılaştırma işleçleri sahip < ve içerdiği türü için ==. Kullanılmayan için normal olarak, bu örneği değil. Bir <a0>şablon</a0> sınıfının bir örneği oluştur, tüm üye işlevleri oluşturulur. STL kapsayıcısı sınıfları işleçler kullanan işlevleri üye olduğundan < ve == içerilen türü için bunları uygulamalıdır. Bilgisayarınızı UDT nesnelerin karşılaştırma anlamlı mı değil, yalnızca "true" dönmek için karşılaştırma işleçleri tanımlayabilirsiniz.

(Bu simge örtülü olarak /MD veya /MDd C çal??ma zaman? DLL sürümü ile bağlamak için derleme yaparken tanımlanır) derleme, aşağıdaki STL sınıfları ve çeşitli genel işleçleri ve işlevleri Bu sınıflar üzerinde çalışması sırasında simge _DLL tanımlandığında, zaten C çalışma zamanı DLL tarafından verilir. Bu nedenle, bunları DLL dosyanızın veremezsiniz. Bu sorun ayrıca C çalışma zamanı DLL sürümü kullanır olarak sınıfınızın alır yürütülebilir programın neden olmamalıdır:
Header      STL template class
------------------------------
<IOSFWD>    basic_ios
<IOSFWD>    <IOSFWD>
<IOSFWD>    basic_istream
<IOSFWD>    basic_string (also typedef'd as string and wstring)
<IOSFWD>    complex
<LOCALE>    messages
<XLOCALE>   codecvt
<XLOCALE>   ctype
<XLOCMON>   moneypunct
<XLOCMON>   money_get
<XLOCMON>   money_put
<XLOCNUM>   numpunct
<XLOCTIME>  time_get
<XLOCTIME>  time_put
<XSTRING>   basic_string (also typedef'd as string and wstring)
				
hangi şablonu parametreleri kullanılır ve hangi genel işlevler ve işleçler bildirilir, belirli ayrıntıları, lütfen ilgili başlık dosya bakın.

Örnek kod

   // -------------------------------------------
   // MYHEADER.H
   //disable warnings on 255 char debug symbols
    #pragma warning (disable : 4786)
   //disable warnings on extern before template instantiation
    #pragma warning (disable : 4231)

    #include <vector>

    // Provide the storage class specifier (extern for an .exe file, null
    // for DLL) and the __declspec specifier (dllimport for .an .exe file,
    // dllexport for DLL).
    // You must define EXP_STL when compiling the DLL.
    // You can now use this header file in both the .exe file and DLL - a
    // much safer means of using common declarations than two different
    // header files.
    #ifdef EXP_STL
    #    define DECLSPECIFIER __declspec(dllexport)
    #    define EXPIMP_TEMPLATE
    #else
    #    define DECLSPECIFIER __declspec(dllimport)
    #    define EXPIMP_TEMPLATE extern
    #endif

    // Instantiate classes vector<int> and vector<char>
    // This does not create an object. It only forces the generation of all
    // of the members of classes vector<int> and vector<char>. It exports
    // them from the DLL and imports them into the .exe file.
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<int>;
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<char>;

    // Declare/Define a class that contains both a static and non-static
    // data member of an STL object.
    // Note that the two template instantiations above are required for
    // the data members to be accessible. If the instantiations above are
    // omitted, you may experience an access violation.
    // Note that since you are exporting a vector of MyClass, you must
    // provide implementations for the operator < and the operator ==.
    class DECLSPECIFIER MyClass
    {
    public:
        std::vector<int> VectorOfInts;
        static std::vector<char> StaticVectorOfChars;

    public:
        bool operator < (const MyClass > c) const
        {
            return VectorOfInts < c. VectorOfInts;
        }
        bool operator == (const MyClass > c) const
        {
            return VectorOfInts == c. VectorOfInts;
        }
    };

    // Instantiate the class vector<MyClass>
    // This does not create an object. It only forces the generation of
    // all of the members of the class vector<MyClass>. It exports them
    // from the DLL and imports them into the .exe file.
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<MyClass>;

    // -------------------------------------------
    // Compile options needed: /GX /LDd /MDd /D"EXP_STL"
    //                     or: /GX /LD  /MD  /D"EXP_STL"
    // DLL.CPP

    #include "MyHeader.h"
    std::vector<char> MyClass::StaticVectorOfChars;

    // -------------------------------------------
    // Compile options needed: /GX /MDd
    //                     or: /GX /MD
    // EXE.CPP

    #include <iostream>
    #include "MyHeader.h"

    int main ()
    {
        MyClass x;

        for (int i=0; i<5; i++) x.VectorOfInts.push_back(i);
        for (char j=0; j<5; j++) x.StaticVectorOfChars.push_back('a' + j);

        std::vector<int>::iterator vii = x.VectorOfInts.begin();
        while (vii != x.VectorOfInts.end())
        {
            std::cout << *vii;
            std::cout << " displayed from x.VectorOfInts" << std::endl;
            vii++;
        }
        std::vector<char>::iterator vci = x.StaticVectorOfChars.begin();
        while (vci != x.StaticVectorOfChars.end())
        {
            std::cout << *vci;
            std::cout << " displayed from MyClass::StaticVectorOfChars";
            std::cout << std::endl;
            vci++;
        }

        std::vector<MyClass> vy;
        for (i=0; i=5; i++) vy.push_back(MyClass());

        return 1;
    }
				

Referanslar

Visual C++ Yard?m?'nda aşağıdaki konular hakkında ek bilgi için ara:
Açık bir örneğini oluşturmada
__declspec
yığın
/ / MD, ML, /MT /LD (çalışma zamanı kitaplığı kullan)

Özellikler

Makale numarası: 168958 - Last Review: 6 Eylül 2005 Salı - Gözden geçirme: 3.0
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Anahtar Kelimeler: 
kbmt kbstl kbinfo kbcode kbhowto KB168958 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:168958

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com