首先, 开门见山, 这个难题的解决办法是用this指针, 或者使用父类配合着scope resolution。 这个问题是我在学习linked list as an ADT , linked list 是含有纯虚函数, 所以是抽象基础类。 然后又linked list 继承出unordered linked list。 注意, 还可以
首先, 开门见山, 这个难题的解决办法是用this指针, 或者使用父类配合着scope resolution。
这个问题是我在学习linked list as an ADT , linked list 是含有纯虚函数, 所以是抽象基础类。 然后又linked list 继承出unordered linked list。 注意, 还可以由linked list 继承出ordered linked list。
言归正传, 出现问题的代码如下:
linkedlist.h 文件如下:
#ifndef H_LinkedListType #define H_LinkedListType #include <iostream> #include <cassert> using namespace std; //Definition of the node template <class type> struct nodeType { Type info; nodeType<type> *link; }; template <class type> class linkedListIterator { public: linkedListIterator(); //Default constructor //Postcondition: current = NULL; linkedListIterator(nodeType<type> *ptr); //Constructor with a parameter. //Postcondition: current = ptr; Type operator*(); //Function to overload the dereferencing operator *. //Postcondition: Returns the info contained in the node. linkedListIterator<type> operator++(); //Overload the pre-increment operator. //Postcondition: The iterator is advanced to the next // node. bool operator==(const linkedListIterator<type>& right) const; //Overload the equality operator. //Postcondition: Returns true if this iterator is equal to // the iterator specified by right, // otherwise it returns the value false. bool operator!=(const linkedListIterator<type>& right) const; //Overload the not equal to operator. //Postcondition: Returns true if this iterator is not // equal to the iterator specified by // right; otherwise it returns the value // false. private: nodeType<type> *current; //pointer to point to the current //node in the linked list }; template <class type> linkedListIterator<type>::linkedListIterator() { current = NULL; } template <class type> linkedListIterator<type>:: linkedListIterator(nodeType<type> *ptr) { current = ptr; } template <class type> Type linkedListIterator<type>::operator*() { return current->info; } template <class type> linkedListIterator<type> linkedListIterator<type>::operator++() { current = current->link; return *this; } template <class type> bool linkedListIterator<type>::operator== (const linkedListIterator<type>& right) const { return (current == right.current); } template <class type> bool linkedListIterator<type>::operator!= (const linkedListIterator<type>& right) const { return (current != right.current); } //***************** class linkedListType **************** template <class type> class linkedListType { public: const linkedListType<type>& operator= (const linkedListType<type>&); //Overload the assignment operator. void initializeList(); //Initialize the list to an empty state. //Postcondition: first = NULL, last = NULL, count = 0; bool isEmptyList() const; //Function to determine whether the list is empty. //Postcondition: Returns true if the list is empty, // otherwise it returns false. void print() const; //Function to output the data contained in each node. //Postcondition: none int length() const; //Function to return the number of nodes in the list. //Postcondition: The value of count is returned. void destroyList(); //Function to delete all the nodes from the list. //Postcondition: first = NULL, last = NULL, count = 0; Type front() const; //Function to return the first element of the list. //Precondition: The list must exist and must not be // empty. //Postcondition: If the list is empty, the program // terminates; otherwise, the first // element of the list is returned. Type back() const; //Function to return the last element of the list. //Precondition: The list must exist and must not be // empty. //Postcondition: If the list is empty, the program // terminates; otherwise, the last // element of the list is returned. virtual bool search(const Type& searchItem) const = 0; //Function to determine whether searchItem is in the list. //Postcondition: Returns true if searchItem is in the // list, otherwise the value false is // returned. virtual void insertFirst(const Type& newItem) = 0; //Function to insert newItem at the beginning of the list. //Postcondition: first points to the new list, newItem is // inserted at the beginning of the list, // last points to the last node in the list, // and count is incremented by 1. virtual void insertLast(const Type& newItem) = 0; //Function to insert newItem at the end of the list. //Postcondition: first points to the new list, newItem // is inserted at the end of the list, // last points to the last node in the list, // and count is incremented by 1. virtual void deleteNode(const Type& deleteItem) = 0; //Function to delete deleteItem from the list. //Postcondition: If found, the node containing // deleteItem is deleted from the list. // first points to the first node, last // points to the last node of the updated // list, and count is decremented by 1. linkedListIterator<type> begin(); //Function to return an iterator at the begining of the //linked list. //Postcondition: Returns an iterator such that current is // set to first. linkedListIterator<type> end(); //Function to return an iterator one element past the //last element of the linked list. //Postcondition: Returns an iterator such that current is // set to NULL. linkedListType(); //default constructor //Initializes the list to an empty state. //Postcondition: first = NULL, last = NULL, count = 0; linkedListType(const linkedListType<type>& otherList); //copy constructor ~linkedListType(); //destructor //Deletes all the nodes from the list. //Postcondition: The list object is destroyed. protected: int count; //variable to store the number of //elements in the list nodeType<type> *first; //pointer to the first node of the list nodeType<type> *last; //pointer to the last node of the list private: void copyList(const linkedListType<type>& otherList); //Function to make a copy of otherList. //Postcondition: A copy of otherList is created and // assigned to this list. }; template <class type> bool linkedListType<type>::isEmptyList() const { return(first == NULL); } template <class type> linkedListType<type>::linkedListType() //default constructor { first = NULL; last = NULL; count = 0; } template <class type> void linkedListType<type>::destroyList() { nodeType<type> *temp; //pointer to deallocate the memory //occupied by the node while (first != NULL) //while there are nodes in the list { temp = first; //set temp to the current node first = first->link; //advance first to the next node delete temp; //deallocate the memory occupied by temp } last = NULL; //initialize last to NULL; first has already //been set to NULL by the while loop count = 0; } template <class type> void linkedListType<type>::initializeList() { destroyList(); //if the list has any nodes, delete them } template <class type> void linkedListType<type>::print() const { nodeType<type> *current; //pointer to traverse the list current = first; //set current so that it points to //the first node while (current != NULL) //while more data to print { cout info link; } }//end print template <class type> int linkedListType<type>::length() const { return count; } //end length template <class type> Type linkedListType<type>::front() const { assert(first != NULL); return first->info; //return the info of the first node }//end front template <class type> Type linkedListType<type>::back() const { assert(last != NULL); return last->info; //return the info of the last node }//end back template <class type> linkedListIterator<type> linkedListType<type>::begin() { linkedListIterator<type> temp(first); return temp; } template <class type> linkedListIterator<type> linkedListType<type>::end() { linkedListIterator<type> temp(NULL); return temp; } template <class type> void linkedListType<type>::copyList (const linkedListType<type>& otherList) { nodeType<type> *newNode; //pointer to create a node nodeType<type> *current; //pointer to traverse the list if (first != NULL) //if the list is nonempty, make it empty destroyList(); if (otherList.first == NULL) //otherList is empty { first = NULL; last = NULL; count = 0; } else { current = otherList.first; //current points to the //list to be copied count = otherList.count; //copy the first node first = new nodeType<type>; //create the node first->info = current->info; //copy the info first->link = NULL; //set the link field of //the node to NULL last = first; //make last point to the //first node current = current->link; //make current point to //the next node //copy the remaining list while (current != NULL) { newNode = new nodeType<type>; //create a node newNode->info = current->info; //copy the info newNode->link = NULL; //set the link of //newNode to NULL last->link = newNode; //attach newNode after last last = newNode; //make last point to //the actual last node current = current->link; //make current point //to the next node }//end while }//end else }//end copyList template <class type> linkedListType<type>::~linkedListType() //destructor { destroyList(); }//end destructor template <class type> linkedListType<type>::linkedListType (const linkedListType<type>& otherList) { first = NULL; copyList(otherList); }//end copy constructor //overload the assignment operator template <class type> const linkedListType<type>& linkedListType<type>::operator= (const linkedListType<type>& otherList) { if (this != &otherList) //avoid self-copy { copyList(otherList); }//end else return *this; } #endif </type></type></type></class></type></type></class></type></class></type></type></type></type></type></type></class></type></type></type></class></type></type></type></class></type></class></type></class></type></class></type></type></class></type></class></type></type></class></type></class></type></class></type></type></type></type></type></type></type></type></class></type></type></class></type></type></class></type></type></class></type></class></type></type></class></type></class></type></type></type></type></type></class></type></class></cassert></iostream>
unorderedLinkedList.h文件如下:
#ifndef H_UnorderedLinkedList #define H_UnorderedLinkedList #include "linkedList.h" using namespace std; template <class type> class unorderedLinkedList: public linkedListType<type> { public: bool search(const Type& searchItem) const; //Function to determine whether searchItem is in the list. //Postcondition: Returns true if searchItem is in the // list, otherwise the value false is // returned. void insertFirst(const Type& newItem); //Function to insert newItem at the beginning of the list. //Postcondition: first points to the new list, newItem is // inserted at the beginning of the list, // last points to the last node in the // list, and count is incremented by 1. void insertLast(const Type& newItem); //Function to insert newItem at the end of the list. //Postcondition: first points to the new list, newItem // is inserted at the end of the list, // last points to the last node in the // list, and count is incremented by 1. void deleteNode(const Type& deleteItem); //Function to delete deleteItem from the list. //Postcondition: If found, the node containing // deleteItem is deleted from the list. // first points to the first node, last // points to the last node of the updated // list, and count is decremented by 1. }; template <class type> bool unorderedLinkedList<type>:: search(const Type& searchItem) const { nodeType<type> *current; //pointer to traverse the list bool found = false; current = first; //set current to point to the first //node in the list while (current != NULL && !found) //search the list if (current->info == searchItem) //searchItem is found found = true; else current = current->link; //make current point to //the next node return found; }//end search template <class type> void unorderedLinkedList<type>::insertFirst(const Type& newItem) { nodeType<type> *newNode; //pointer to create the new node newNode = new nodeType<type>; //create the new node newNode->info = newItem; //store the new item in the node newNode->link = this -> first; //insert newNode before first first = newNode; //make first point to the //actual first node count++; //increment count if (last == NULL) //if the list was empty, newNode is also //the last node in the list last = newNode; }//end insertFirst template <class type> void unorderedLinkedList<type>::insertLast(const Type& newItem) { nodeType<type> *newNode; //pointer to create the new node newNode = new nodeType<type>; //create the new node newNode->info = newItem; //store the new item in the node newNode->link = NULL; //set the link field of newNode //to NULL if ( first == NULL) //if the list is empty, newNode is //both the first and last node { first = newNode; last = newNode; count++; //increment count } else //the list is not empty, insert newNode after last { last->link = newNode; //insert newNode after last last = newNode; //make last point to the actual //last node in the list count++; //increment count } }//end insertLast template <class type> void unorderedLinkedList<type>::deleteNode(const Type& deleteItem) { nodeType<type> *current; //pointer to traverse the list nodeType<type> *trailCurrent; //pointer just before current bool found; if (first == NULL) //Case 1; the list is empty. cout info == deleteItem) //Case 2 { current = first; first = first->link; count--; if (first == NULL) //the list has only one node last = NULL; delete current; } else //search the list for the node with the given info { found = false; trailCurrent = first; //set trailCurrent to point //to the first node current = first->link; //set current to point to //the second node while (current != NULL && !found) { if (current->info != deleteItem) { trailCurrent = current; current = current-> link; } else found = true; }//end while if (found) //Case 3; if found, delete the node { trailCurrent->link = current->link; this -> count--; if (last == current) //node to be deleted //was the last node last = trailCurrent; //update the value //of last delete current; //delete the node from the list } else cout <br> 主程序如下main.cpp: <pre class="brush:php;toolbar:false">//This program tests various operation of a linked list //34 62 21 90 66 53 88 24 10 -999 #include <iostream> #include "unorderedLinkedList.h" using namespace std; int main() { unorderedLinkedList<int> list1, list2; //Line 1 int num; //Line 2 cout > num; //Line 4 while (num != -999) //Line 5 { list1.insertLast(num); //Line 6 cin >> num; //Line 7 } cout > num; //Line 19 cout it; //Line 27 for (it = list1.begin(); it != list1.end(); ++it) //Line 28 cout <br> 编译结果error message 如下: <p><img src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140730194616575%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTEzMDczNw%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fa130737%2Farticle%2Fdetails%2F38305293" class="lazy" alt="C++ 关于模板之间的继承, 导致的模板子类的成员看不到(cannot" ><br> </p> <p><br> </p> <p>错误分析: 按照标准看, 上述的错误似乎有点问题。 因为first, last, count 都是父类的成员变量。 存取类型是protected。 我们的子类unorderedLinkedList 类是公开方式(public)继承linkedList。按说子类即unorderedLinkedList 的成员函数(虚函数)当然可以access 父类的protected 成员变量。 但是在这里出错了。 为什么呢?</p> <p><br> </p> <p>原因是我们这里是模板类之间的继承。 如果是正常的普通类之间的继承, 结果一定是没有问题的。 当然access会通过, 编译会okay。 但是这里是模本类之间的继承。</p> <p>在这里, 我们需要使用this 指针, 也可以使用scope resolution解决模板类之间的继承时变量访问的问题。 下面我们修改unorderedLinkedList.h 如下:</p> <p>将模板成员函数定义count, first, last 分别用this -> count, this -> first, this -> last(第二中解决办法是换为linkedListType<type>::first, linkedListType<type>::count,linkedListType<type>::last)。 不光如此, 当在子类中调用模板父类的成员函数的时候, 也要使用this 指针或者用scope resotion 解决这个问题。</type></type></type></p> <p><br> </p> <pre class="brush:php;toolbar:false">#ifndef H_UnorderedLinkedList #define H_UnorderedLinkedList #include "linkedList.h" using namespace std; template <class type> class unorderedLinkedList: public linkedListType<type> { public: bool search(const Type& searchItem) const; //Function to determine whether searchItem is in the list. //Postcondition: Returns true if searchItem is in the // list, otherwise the value false is // returned. void insertFirst(const Type& newItem); //Function to insert newItem at the beginning of the list. //Postcondition: first points to the new list, newItem is // inserted at the beginning of the list, // last points to the last node in the // list, and count is incremented by 1. void insertLast(const Type& newItem); //Function to insert newItem at the end of the list. //Postcondition: first points to the new list, newItem // is inserted at the end of the list, // last points to the last node in the // list, and count is incremented by 1. void deleteNode(const Type& deleteItem); //Function to delete deleteItem from the list. //Postcondition: If found, the node containing // deleteItem is deleted from the list. // first points to the first node, last // points to the last node of the updated // list, and count is decremented by 1. }; template <class type> bool unorderedLinkedList<type>:: search(const Type& searchItem) const { nodeType<type> *current; //pointer to traverse the list bool found = false; current = this -> first; //set current to point to the first //node in the list while (current != NULL && !found) //search the list if (current->info == searchItem) //searchItem is found found = true; else current = current->link; //make current point to //the next node return found; }//end search template <class type> void unorderedLinkedList<type>::insertFirst(const Type& newItem) { nodeType<type> *newNode; //pointer to create the new node newNode = new nodeType<type>; //create the new node newNode->info = newItem; //store the new item in the node newNode->link = this -> first; //insert newNode before first this -> first = newNode; //make first point to the //actual first node this -> count++; //increment count if (this -> last == NULL) //if the list was empty, newNode is also //the last node in the list this -> last = newNode; }//end insertFirst template <class type> void unorderedLinkedList<type>::insertLast(const Type& newItem) { nodeType<type> *newNode; //pointer to create the new node newNode = new nodeType<type>; //create the new node newNode->info = newItem; //store the new item in the node newNode->link = NULL; //set the link field of newNode //to NULL if ( this -> first == NULL) //if the list is empty, newNode is //both the first and last node { this -> first = newNode; this -> last = newNode; this -> count++; //increment count } else //the list is not empty, insert newNode after last { this -> last->link = newNode; //insert newNode after last this -> last = newNode; //make last point to the actual //last node in the list this -> count++; //increment count } }//end insertLast template <class type> void unorderedLinkedList<type>::deleteNode(const Type& deleteItem) { nodeType<type> *current; //pointer to traverse the list nodeType<type> *trailCurrent; //pointer just before current bool found; if (this -> first == NULL) //Case 1; the list is empty. cout first->info == deleteItem) //Case 2 { current = this -> first; this -> first = this -> first->link; this -> count--; if (this -> first == NULL) //the list has only one node this -> last = NULL; delete current; } else //search the list for the node with the given info { found = false; trailCurrent = this -> first; //set trailCurrent to point //to the first node current = this -> first->link; //set current to point to //the second node while (current != NULL && !found) { if (current->info != deleteItem) { trailCurrent = current; current = current-> link; } else found = true; }//end while if (found) //Case 3; if found, delete the node { trailCurrent->link = current->link; this -> count--; if (this -> last == current) //node to be deleted //was the last node this -> last = trailCurrent; //update the value //of last delete current; //delete the node from the list } else cout <br> 编译通过, 运行结果如下: <p><img src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140730200300296%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTEzMDczNw%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fa130737%2Farticle%2Fdetails%2F38305293" class="lazy" alt="C++ 关于模板之间的继承, 导致的模板子类的成员看不到(cannot" ><br> </p> <p><br> </p> <p><br> </p> <p>关于这个模板继承, 子类使用父类的成员是使用this, 或者scope resolution, 解释如下:</p> <p>//To make the code valid either use this->f(), or Base::f(). Using the -fpermissive flag will also<br> //let the compiler accept the code, by marking all function calls for which no declaration is visible<br> //at the time of definition of the template for later lookup at instantiation time, as if it were a<br> //dependent call. We do not recommend using -fpermissive to work around invalid code, and it will also<br> //only catch cases where functions in base classes are called, not where variables in base classes are<br> //used (as in the example above).<br> //<br> //Note that some compilers (including G++ versions prior to 3.4) get these examples wrong and accept above<br> //code without an error. Those compilers do not implement two-stage name lookup correctly.<br> //<br> </p> <p><br> </p> <p>接下来是我在stack overflow 网站上得到的解答:</p> <p><img src="/static/imghwm/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140730201910930%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTEzMDczNw%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fa130737%2Farticle%2Fdetails%2F38305293" class="lazy" alt="C++ 关于模板之间的继承, 导致的模板子类的成员看不到(cannot" ><br> </p> </type></type></type></class></type></type></type></class></type></type></type></class></type></type></class></type></class>

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQLは、中小企業に適しています。 1)中小企業は、顧客情報の保存など、基本的なデータ管理にMySQLを使用できます。 2)大企業はMySQLを使用して、大規模なデータと複雑なビジネスロジックを処理して、クエリのパフォーマンスとトランザクション処理を最適化できます。

INNODBは、次のキーロックメカニズムを通じてファントムの読み取りを効果的に防止します。 1)Next-KeyLockingは、Row LockとGap Lockを組み合わせてレコードとギャップをロックして、新しいレコードが挿入されないようにします。 2)実際のアプリケーションでは、クエリを最適化して分離レベルを調整することにより、ロック競争を削減し、並行性パフォーマンスを改善できます。

MySQLはプログラミング言語ではありませんが、そのクエリ言語SQLにはプログラミング言語の特性があります。1。SQLは条件付き判断、ループ、可変操作をサポートします。 2。ストアドプロシージャ、トリガー、機能を通じて、ユーザーはデータベースで複雑な論理操作を実行できます。

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

MySQLは、データストレージ、管理、クエリ、セキュリティに適したオープンソースのリレーショナルデータベース管理システムです。 1.さまざまなオペレーティングシステムをサポートし、Webアプリケーションやその他のフィールドで広く使用されています。 2。クライアントサーバーアーキテクチャとさまざまなストレージエンジンを通じて、MySQLはデータを効率的に処理します。 3.基本的な使用には、データベースとテーブルの作成、挿入、クエリ、データの更新が含まれます。 4.高度な使用には、複雑なクエリとストアドプロシージャが含まれます。 5.一般的なエラーは、説明ステートメントを介してデバッグできます。 6.パフォーマンスの最適化には、インデックスの合理的な使用と最適化されたクエリステートメントが含まれます。

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

INNODBのロックメカニズムには、共有ロック、排他的ロック、意図ロック、レコードロック、ギャップロック、次のキーロックが含まれます。 1.共有ロックにより、トランザクションは他のトランザクションが読み取らないようにデータを読み取ることができます。 2.排他的ロックは、他のトランザクションがデータの読み取りと変更を防ぎます。 3.意図ロックは、ロック効率を最適化します。 4。ロックロックインデックスのレコードを記録します。 5。ギャップロックロックインデックス記録ギャップ。 6.次のキーロックは、データの一貫性を確保するためのレコードロックとギャップロックの組み合わせです。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

Dreamweaver Mac版
ビジュアル Web 開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。
